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 *************************************************************************
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @file   M4MCS_API.c
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief  MCS implementation (Video Compressor Service)
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note   This file implements the API and the processing of the MCS
227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *************************************************************************
237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi **/
247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************************************************************
277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Includes
287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************************************************************
297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * OSAL headers */
327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Memory.h" /**< OSAL memory management */
337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h"  /**< OSAL debug management */
347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* PCM samples */
361526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma#include "VideoEditorResampler.h"
377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Decoder interface */
397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4DECODER_Common.h"
407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Encoder interface*/
427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4ENCODER_common.h"
437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Enable for DEBUG logging */
457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi//#define MCS_DUMP_PCM_TO_FILE
467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef MCS_DUMP_PCM_TO_FILE
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <stdio.h>
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiFILE *file_au_reader = NULL;
497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiFILE *file_pcm_decoder = NULL;
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiFILE *file_pcm_encoder = NULL;
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Core headers */
547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_API.h"
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_ErrorCodes.h"
567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_InternalTypes.h"
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_InternalConfig.h"
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_InternalFunctions.h"
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MCS_StillPicture.h"
627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Common headers (for aac) */
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4_Common.h"
667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "NXPSW_CompilerSwitches.h"
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VD_EXTERNAL_Interface.h"
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4AIR_API.h"
7495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury#include "OMX_Video.h"
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Version */
777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4MCS_VERSION_MAJOR 3
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4MCS_VERSION_MINOR 4
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4MCS_VERSION_REVISION  3
807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************************************************************
837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Static local functions
847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ********************************************************************
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intStepSet( M4MCS_InternalContext *pC );
887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intPrepareVideoDecoder(
897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4MCS_InternalContext *pC );
907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intPrepareVideoEncoder(
917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4MCS_InternalContext *pC );
927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intPrepareAudioProcessing(
937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4MCS_InternalContext *pC );
947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intPrepareWriter( M4MCS_InternalContext *pC );
957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intPrepareAudioBeginCut(
967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4MCS_InternalContext *pC );
977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intStepEncoding(
987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4MCS_InternalContext *pC,
997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4OSA_UInt8 *pTranscodedTime );
1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intStepBeginVideoJump(
1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4MCS_InternalContext *pC );
1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intStepBeginVideoDecode(
1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4MCS_InternalContext *pC );
1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intAudioNullEncoding( M4MCS_InternalContext *pC );
1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intAudioTranscoding( M4MCS_InternalContext *pC );
1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intVideoNullEncoding( M4MCS_InternalContext *pC );
1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intVideoTranscoding( M4MCS_InternalContext *pC );
1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intGetInputClipProperties(
1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4MCS_InternalContext   *pContext );
1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 M4MCS_intGetFrameSize_AMRNB(
1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4OSA_MemAddr8 pAudioFrame );
1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 M4MCS_intGetFrameSize_EVRC(
1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4OSA_MemAddr8 pAudioFrame );
1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intCheckMaxFileSize( M4MCS_Context pContext );
1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4VIDEOEDITING_Bitrate M4MCS_intGetNearestBitrate(
1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4OSA_Int32 freebitrate,
1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4OSA_Int8 mode );
1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intCleanUp_ReadersDecoders(
1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4MCS_InternalContext *pC );
1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intReallocTemporaryAU(
1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4OSA_MemAddr8 *addr,
1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4OSA_UInt32 newSize );
1238a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdurystatic M4OSA_ERR M4MCS_intCheckAndGetCodecProperties(
124bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury                                 M4MCS_InternalContext *pC);
1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdurystatic M4OSA_ERR M4MCS_intLimitBitratePerCodecProfileLevel(
12795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                 M4ENCODER_AdvancedParams* EncParams);
12895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdurystatic M4OSA_Int32 M4MCS_intLimitBitrateForH263Enc(M4OSA_Int32 profile,
12995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                 M4OSA_Int32 level, M4OSA_Int32 bitrate);
13095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdurystatic M4OSA_Int32 M4MCS_intLimitBitrateForMpeg4Enc(M4OSA_Int32 profile,
13195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                 M4OSA_Int32 level, M4OSA_Int32 bitrate);
13295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdurystatic M4OSA_Int32 M4MCS_intLimitBitrateForH264Enc(M4OSA_Int32 profile,
13395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                 M4OSA_Int32 level, M4OSA_Int32 bitrate);
13495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi **********************************************************************
1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * External function used only by VideoEditor and that does not appear
1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * in the API
1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi **********************************************************************
1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_open_normalMode( M4MCS_Context pContext,
1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 M4OSA_Void *pFileIn,
1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 M4VIDEOEDITING_FileType InputFileType,
1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 M4OSA_Void *pFileOut,
1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 M4OSA_Void *pTempFile );
1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* All errors are fatal in the MCS */
1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4ERR_CHECK_RETURN(err) if(M4NO_ERROR!=err) return err;
1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* A define used with SSRC 1.04 and above to avoid taking blocks smaller
1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * that the minimal block size
1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4MCS_SSRC_MINBLOCKSIZE        100
1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UChar Tab_MCS[8] =
1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    17, 5, 3, 3, 1, 1, 1, 1
1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi};
1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR H264MCS_Getinstance( NSWAVC_MCS_t ** instance )
1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    NSWAVC_MCS_t *p_bs = M4OSA_NULL;
1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
165694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu    p_bs = (NSWAVC_MCS_t *)M4OSA_32bitAlignedMalloc(sizeof(NSWAVC_MCS_t), M4MCS,
1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Char *)"NSWAVC_MCS_t");
1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == p_bs )
1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0("H264MCS_Getinstance: allocation error");
1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_ALLOC;
1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->prev_frame_num = 0;
1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->cur_frame_num = 0;
1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->log2_max_frame_num_minus4 = 0;
1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->prev_new_frame_num = 0;
1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->is_done = 0;
1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->is_first = 1;
1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->m_pDecoderSpecificInfo = M4OSA_NULL;
1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->m_decoderSpecificInfoSize = 0;
1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->m_pEncoderSPS = M4OSA_NULL;
1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->m_encoderSPSSize = 0;
1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->m_pEncoderPPS = M4OSA_NULL;
1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->m_encoderPPSSize = 0;
1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->m_pFinalDSI = M4OSA_NULL;
1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->m_pFinalDSISize = 0;
1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->p_clip_sps = M4OSA_NULL;
1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->m_encoder_SPS_Cnt = 0;
1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->p_clip_pps = M4OSA_NULL;
1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->m_encoder_PPS_Cnt = 0;
1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->p_encoder_sps = M4OSA_NULL;
2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->p_encoder_pps = M4OSA_NULL;
2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->encoder_pps.slice_group_id = M4OSA_NULL;
2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *instance = (NSWAVC_MCS_t *)p_bs;
2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_UInt32 H264MCS_getBits( ComBitStreamMCS_t *p_bs, M4OSA_UInt32 numBits )
2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 ui32RetBits;
2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 *pbs;
2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 bcnt;
2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->i8BitCnt -= numBits;
2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    bcnt = p_bs->i8BitCnt;
2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Measure the quantity of bits to be read in ui32TempBuff */
2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    ui32RetBits = p_bs->ui32TempBuff >> (32 - numBits);
2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Read numBits in ui32TempBuff */
2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->ui32TempBuff <<= numBits;
2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->bitPos += numBits;
2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( bcnt > 24 )
2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return (ui32RetBits);
2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    { /* at least one byte can be buffered in ui32TempBuff */
2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pbs = (M4OSA_UInt8 *)p_bs->pui8BfrPtr;
2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( bcnt < (int)(p_bs->numBitsInBuffer - p_bs->bitPos) )
2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        { /* not enough remaining bits in ui32TempBuff: need to be filled */
2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            do
2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* On the fly detection of EPB byte */
2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( ( *(pbs) == 0x03)
2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    && (!(( pbs[-1])
2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    | (pbs[-2])))) //(p_bs->ui32LastTwoBytes & 0x0000FFFF) == 0)
2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* EPB byte found: skip it and update bitPos accordingly */
2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (pbs)++;
2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            p_bs->bitPos += 8;
2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        p_bs->ui32TempBuff |= *(pbs)++ << (24 - bcnt);
2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        bcnt += 8;
2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } while ( bcnt <= 24 );
2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            p_bs->pui8BfrPtr = (M4OSA_Int8 *)pbs;
2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            p_bs->i8BitCnt = bcnt;
2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return (ui32RetBits);
2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( p_bs->bitPos <= p_bs->numBitsInBuffer )
2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return (ui32RetBits);
2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return (0);
2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_Void H264MCS_flushBits( ComBitStreamMCS_t *p_bs, M4OSA_UInt32 numBits )
2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 *pbs;
2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 bcnt;
2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->i8BitCnt -= numBits;
2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    bcnt = p_bs->i8BitCnt;
2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->ui32TempBuff <<= numBits;
2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->bitPos += numBits;
2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( bcnt > 24 )
2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return;
2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    { /* at least one byte can be buffered in ui32TempBuff */
2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pbs = (M4OSA_UInt8 *)p_bs->pui8BfrPtr;
2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( bcnt < (p_bs->numBitsInBuffer - p_bs->bitPos) )
2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {   /* Not enough remaining bits in ui32TempBuff: need to be filled */
2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            do
2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /*  On the fly detection of EPB byte */
2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( ( *(pbs) == 0x03) && (!(( pbs[-1]) | (pbs[-2]))) )
2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                { /* JC: EPB byte found: skip it and update bitPos accordingly */
2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (pbs)++;
2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    p_bs->bitPos += 8;
2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                p_bs->ui32TempBuff |= *(pbs)++ << (24 - bcnt);
2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                bcnt += 8;
2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } while ( bcnt <= 24 );
2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            p_bs->pui8BfrPtr = (M4OSA_Int8 *)pbs;
2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            p_bs->i8BitCnt = bcnt;
2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return;
3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_UInt32 H264MCS_DecVLCReadExpGolombCode( ComBitStreamMCS_t *p_bs )
3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 code, l0 = 0, l1;
3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Reading 32 Bits from local cache buffer of Bitstream structure*/
3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    code = p_bs->ui32TempBuff;
3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Checking in first 3 bits*/
3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( code >> 29 )
3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        l0 = Tab_MCS[(code >> 29)];
3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        code = code >> (32 - l0);
3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        H264MCS_flushBits(p_bs, l0);
3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( code )
3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                code <<= 3;
3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                for ( l0 = 3; code < 0x80000000; code <<= 1, l0++ );
3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( l0 < 16 ) /*all useful bits are inside the 32 bits read */
3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    code = code >> (31 - l0);
3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    H264MCS_flushBits(p_bs, 2 * l0 + 1);
3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else
3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            { /* Read the useful bits in 2 parts */
3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    l1 = ( l0 << 1) - 31;
3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    code >>= l0;
3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    H264MCS_flushBits(p_bs, 32);
3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    code = ( code << l1) | H264MCS_getBits(p_bs, l1);
3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                H264MCS_flushBits(p_bs, 32);
3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( H264MCS_getBits(p_bs, 1) )
3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* if number of leading 0's is 32, the only code allowed is 1 followed
3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    by 32 0's */
3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /*reading 32 more bits from bitstream buffer*/
3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    code = H264MCS_getBits(p_bs, 32);
3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( code == 0 )
3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return (code - 1);
3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /*if number of leading 0's is >32, then symbol is >32 bits,
3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                which is an error */
3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                //p_bs->state = _BS_ERR;
3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                //p_bs->flags |= _BF_SYM_ERR;
3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return (0);
3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( 1 ) //(p_bs->state == _BS_OK)
3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return (code - 1);
3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return (0);
3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_Int32 H264MCS_DecVLCReadSignedExpGolombCode( ComBitStreamMCS_t *p_bs )
3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 codeNo, ret;
3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* read the unsigned code number */
3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    codeNo = H264MCS_DecVLCReadExpGolombCode(p_bs);
3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* map to the signed value, if value is odd then it's positive,
3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if even then it's negative, formula is (-1)^(k+1)*CEIL(k/2) */
3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    ret = (codeNo & 0x01) ? (( codeNo + 1) >> 1) : (( -codeNo) >> 1);
3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return ret;
3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_Void DecBitStreamReset_MCS( ComBitStreamMCS_t *p_bs,
3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 M4OSA_UInt32 bytes_read )
3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->bitPos = 0;
3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->lastTotalBits = 0;
3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->numBitsInBuffer = bytes_read << 3;
3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->readableBytesInBuffer = bytes_read;
3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    //p_bs->state = M4NO_ERROR;//_BS_OK;
3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    //p_bs->flags = 0;
3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->ui32TempBuff = 0;
4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->i8BitCnt = 0;
4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->pui8BfrPtr = (M4OSA_Int8 *)p_bs->Buffer;
4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->ui32LastTwoBytes = 0xFFFFFFFF;
4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    H264MCS_getBits(p_bs, 0);
4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR NSWAVCMCS_initBitstream( NSWAVC_bitStream_t_MCS *bS )
4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    bS->bitPos = 0;
4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    bS->byteCnt = 0;
4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    bS->currBuff = 0;
4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    bS->prevByte = 0xff;
4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    bS->prevPrevByte = 0xff;
4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR NSWAVCMCS_putBits( NSWAVC_bitStream_t_MCS *bS, M4OSA_UInt32 value,
4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_UInt8 length )
4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 maskedValue = 0, temp = 0;
4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 byteOne;
4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 len1 = (length == 32) ? 31 : length;
4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( !(length) )
4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Length = 0, return OK*/
4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    maskedValue = (M4OSA_UInt32)(value &(( 1 << len1) - 1));
4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( 32 > (length + bS->bitPos) )
4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bS->bitPos += length;
4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bS->currBuff |= maskedValue << (32 - bS->bitPos);
4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        temp = (( bS->bitPos + length) - 32);
4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bS->currBuff |= (maskedValue >> (temp));
4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        byteOne =
4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->streamBuffer[bS->byteCnt++] = (M4OSA_UInt8)(bS->currBuff >> 24);
4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (( bS->prevPrevByte
4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == 0) & (bS->prevByte == 0) & (!(byteOne & 0xFC))) )
4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->byteCnt -= 1;
4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->streamBuffer[bS->byteCnt++] = 0x03;
4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = bS->streamBuffer[bS->byteCnt++] = byteOne;
4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->prevByte;
4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = byteOne;
4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        byteOne = bS->streamBuffer[bS->byteCnt++] =
4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt8)(( bS->currBuff >> 16) & 0xff);
4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (( bS->prevPrevByte
4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == 0) & (bS->prevByte == 0) & (!(byteOne & 0xFC))) )
4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->byteCnt -= 1;
4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->streamBuffer[bS->byteCnt++] = 0x03;
4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = bS->streamBuffer[bS->byteCnt++] = byteOne;
4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
4707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->prevByte;
4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = byteOne;
4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        byteOne = bS->streamBuffer[bS->byteCnt++] =
4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt8)(( bS->currBuff >> 8) & 0xff);
4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (( bS->prevPrevByte
4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == 0) & (bS->prevByte == 0) & (!(byteOne & 0xFC))) )
4807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->byteCnt -= 1;
4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->streamBuffer[bS->byteCnt++] = 0x03;
4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = bS->streamBuffer[bS->byteCnt++] = byteOne;
4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->prevByte;
4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = byteOne;
4897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        byteOne = bS->streamBuffer[bS->byteCnt++] =
4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt8)((bS->currBuff) &0xff);
4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (( bS->prevPrevByte
4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == 0) & (bS->prevByte == 0) & (!(byteOne & 0xFC))) )
4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->byteCnt -= 1;
4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->streamBuffer[bS->byteCnt++] = 0x03;
4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = bS->streamBuffer[bS->byteCnt++] = byteOne;
4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->prevByte;
5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = byteOne;
5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bS->currBuff = 0;
5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bS->currBuff |= ( maskedValue &(( 1 << temp) - 1)) << (32 - temp);
5097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bS->bitPos = temp;
5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR NSWAVCMCS_putBit( NSWAVC_bitStream_t_MCS *bS, M4OSA_UInt32 value )
5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
5187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 maskedValue = 0, temp = 0;
5197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 byteOne;
5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    maskedValue = (value ? 1 : 0);
5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( 32 > (1 + bS->bitPos) )
5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bS->bitPos += 1;
5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bS->currBuff |= maskedValue << (32 - bS->bitPos);
5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        temp = 0;
5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bS->currBuff |= (maskedValue);
5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* writing it to memory*/
5357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        byteOne =
5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->streamBuffer[bS->byteCnt++] =
5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt8)(bS->currBuff >> 24);
5387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (( bS->prevPrevByte
5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == 0) & (bS->prevByte == 0) & (!(byteOne & 0xFC))) )
5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->byteCnt -= 1;
5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->streamBuffer[bS->byteCnt++] = 0x03;
5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = bS->streamBuffer[bS->byteCnt++] = byteOne;
5457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->prevByte;
5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = byteOne;
5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        byteOne = bS->streamBuffer[bS->byteCnt++] =
5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt8)(( bS->currBuff >> 16) & 0xff);
5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (( bS->prevPrevByte
5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == 0) & (bS->prevByte == 0) & (!(byteOne & 0xFC))) )
5567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->byteCnt -= 1;
5587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->streamBuffer[bS->byteCnt++] = 0x03;
5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = bS->streamBuffer[bS->byteCnt++] = byteOne;
5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
5627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
5637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->prevByte;
5647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = byteOne;
5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        byteOne = bS->streamBuffer[bS->byteCnt++] =
5677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt8)(( bS->currBuff >> 8) & 0xff);
5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (( bS->prevPrevByte
5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == 0) & (bS->prevByte == 0) & (!(byteOne & 0xFC))) )
5717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->byteCnt -= 1;
5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->streamBuffer[bS->byteCnt++] = 0x03;
5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = bS->streamBuffer[bS->byteCnt++] = byteOne;
5757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->prevByte;
5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = byteOne;
5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        byteOne = bS->streamBuffer[bS->byteCnt++] =
5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt8)((bS->currBuff) &0xff);
5837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (( bS->prevPrevByte
5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == 0) & (bS->prevByte == 0) & (!(byteOne & 0xFC))) )
5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->byteCnt -= 1;
5887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->streamBuffer[bS->byteCnt++] = 0x03;
5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = bS->streamBuffer[bS->byteCnt++] = byteOne;
5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevPrevByte = bS->prevByte;
5947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->prevByte = byteOne;
5957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bS->currBuff = 0;
5977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bS->bitPos = 0;
5987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
5997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
6017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
6027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_Int32 NSWAVCMCS_putRbspTbits( NSWAVC_bitStream_t_MCS *bS )
6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 trailBits = 0;
6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 byteCnt = 0;
6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    trailBits = (M4OSA_UInt8)(bS->bitPos % 8);
6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Already in the byte aligned position,
6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    RBSP trailing bits will be 1000 0000 */
6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( 0 == trailBits )
6137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        trailBits = (1 << 7);
6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        NSWAVCMCS_putBits(bS, trailBits, 8);
6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        trailBits = (8 - trailBits);
6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        NSWAVCMCS_putBit(bS, 1);
6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        trailBits--;
6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( trailBits )
6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        { /* put trailBits times zeros */
6257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            NSWAVCMCS_putBits(bS, 0, trailBits);
6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* For writting the currBuff in streamBuff 4byte alignment is required*/
6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    byteCnt = (M4OSA_UInt8)(( bS->bitPos + 4) / 8);
6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( byteCnt )
6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
6347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 1:
6357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->streamBuffer[bS->byteCnt++] = (M4OSA_UInt8)(bS->currBuff >> 24);
6367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 2:
6397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->streamBuffer[bS->byteCnt++] = (M4OSA_UInt8)(bS->currBuff >> 24);
6407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->streamBuffer[bS->byteCnt++] =
6417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt8)(( bS->currBuff >> 16) & 0xff);
6427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
6437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 3:
6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->streamBuffer[bS->byteCnt++] = (M4OSA_UInt8)(bS->currBuff >> 24);
6467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->streamBuffer[bS->byteCnt++] =
6477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt8)(( bS->currBuff >> 16) & 0xff);
6487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bS->streamBuffer[bS->byteCnt++] =
6497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt8)(( bS->currBuff >> 8) & 0xff);
6507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
6527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
6547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* It will not come here */
6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    //    bS->bitPos =0;
6597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    //    bS->currBuff = 0;
6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR NSWAVCMCS_uExpVLC( NSWAVC_bitStream_t_MCS *bS, M4OSA_Int32 codeNum )
6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
6667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 loop, temp;
6687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 data = 0;
6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 codeLen = 0;
6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* The codeNum cannot be less than zero for this ue(v) */
6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( codeNum < 0 )
6737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
6747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return 0;
6757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Implementation for Encoding of the Table 9-1 in the Standard */
6787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    temp = codeNum + 1;
6797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for ( loop = 0; temp != 0; loop++ )
6817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        temp /= 2;
6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    codeLen = (( loop * 2) - 1);
6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    data = codeNum + 1;
6887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    NSWAVCMCS_putBits(bS, data, codeLen);
6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR NSWAVCMCS_sExpVLC( NSWAVC_bitStream_t_MCS *bS, M4OSA_Int32 codeNum )
6957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
6967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 loop, temp1, temp2;
6987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 data = 0;
6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 codeLen = 0, isPositive = 0;
7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 abscodeNum;
7017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( codeNum > 0 )
7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
7047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        isPositive = 1;
7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( codeNum > 0 )
7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
7097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        abscodeNum = codeNum;
7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
7137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        abscodeNum = -codeNum;
7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    temp1 = ( ( ( abscodeNum) << 1) - isPositive) + 1;
7177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    temp2 = temp1;
7187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for ( loop = 0; loop < 16 && temp2 != 0; loop++ )
7207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
7217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        temp2 /= 2;
7227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    codeLen = ( loop * 2) - 1;
7257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    data = temp1;
7277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    NSWAVCMCS_putBits(bS, data, codeLen);
7297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
7317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
7327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR H264MCS_ProcessEncodedNALU(   M4OSA_Void *ainstance,
7347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4OSA_UInt8 *inbuff,
7357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4OSA_Int32 inbuf_size,
7367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4OSA_UInt8 *outbuff,
7377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4OSA_Int32 *outbuf_size )
7387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
7397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    ComBitStreamMCS_t *p_bs, bs;
7407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    NSWAVC_MCS_t *instance;
7417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 nalu_info;
7427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 forbidden_bit, nal_ref_idc, nal_unit_type;
7437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 first_mb_in_slice, slice_type, pic_parameter_set_id, frame_num;
7447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 seq_parameter_set_id;
7457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 temp1, temp2, temp3, temp4;
7467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 temp_frame_num;
7477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 bitstoDiacard, bytes;
7487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 mask_bits = 0xFFFFFFFF;
7497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 new_bytes, init_bit_pos;
7507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 nal_size;
7517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 cnt;
7527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 outbuffpos = 0;
7537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 nal_size_low16, nal_size_high16;
7547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 frame_size = 0;
7557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 temp = 0;
7567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // StageFright encoder does not provide the size in the first 4 bytes of the AU, add it
7587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int8 *pTmpBuff1 = M4OSA_NULL;
7597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int8 *pTmpBuff2 = M4OSA_NULL;
7607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs = &bs;
7627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    instance = (NSWAVC_MCS_t *)ainstance;
7637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE1_2(
7657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "In  H264MCS_ProcessEncodedNALU with FrameSize = %d  inBuf_Size=%d",
7667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        frame_size, inbuf_size);
7677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // StageFright codecs may add a start code, make sure it is not present
7697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu    if( !memcmp((void *)inbuff,
77132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        "\x00\x00\x00\x01", 4) )
7727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
7737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_3(
7747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "H264MCS_ProcessNALU ERROR : NALU start code has not been removed %d "
7757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "0x%X 0x%X", inbuf_size, ((M4OSA_UInt32 *)inbuff)[0],
7767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ((M4OSA_UInt32 *)inbuff)[1]);
7777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
7797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
7807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // StageFright encoder does not provide the size in the first 4 bytes of the AU, add it
782694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu    pTmpBuff1 = (M4OSA_Int8 *)M4OSA_32bitAlignedMalloc(inbuf_size + 4, M4MCS,
7837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Char *)"tmpNALU");
78432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu    memcpy((void *)(pTmpBuff1 + 4), (void *)inbuff,
7857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        inbuf_size);
7867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pTmpBuff1[3] = ( (M4OSA_UInt32)inbuf_size) & 0x000000FF;
7877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pTmpBuff1[2] = ( (M4OSA_UInt32)inbuf_size >> 8) & 0x000000FF;
7887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pTmpBuff1[1] = ( (M4OSA_UInt32)inbuf_size >> 16) & 0x000000FF;
7897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pTmpBuff1[0] = ( (M4OSA_UInt32)inbuf_size >> 24) & 0x000000FF;
7907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pTmpBuff2 = (M4OSA_Int8 *)inbuff;
7917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    inbuff = (M4OSA_UInt8 *)pTmpBuff1;
7927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    inbuf_size += 4;
7937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
7947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Make sure the available size was set
7957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( inbuf_size >= *outbuf_size )
7967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
7977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
7987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "!!! H264MCS_ProcessNALU ERROR : specified available size is incorrect %d ",
7997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *outbuf_size);
8007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
8017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
8027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while( (M4OSA_Int32)frame_size < inbuf_size )
8067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
8077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mask_bits = 0xFFFFFFFF;
8087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->Buffer = (M4OSA_UInt8 *)(inbuff + frame_size);
8097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Use unsigned value to fix errors due to bit sign extension, this fix should be generic
8117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nal_size_high16 = ( ( (M4OSA_UInt8 *)p_bs->Buffer)[0] << 8)
8137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            + ((M4OSA_UInt8 *)p_bs->Buffer)[1];
8147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nal_size_low16 = ( ( (M4OSA_UInt8 *)p_bs->Buffer)[2] << 8)
8157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            + ((M4OSA_UInt8 *)p_bs->Buffer)[3];
8167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nalu_info = (unsigned char)p_bs->Buffer[4];
8187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outbuff[outbuffpos] = p_bs->Buffer[4];
8207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->Buffer = p_bs->Buffer + 5;
8227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->bitPos = 0;
8247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->lastTotalBits = 0;
8257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->numBitsInBuffer = ( inbuf_size - frame_size - 5) << 3;
8267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->readableBytesInBuffer = inbuf_size - frame_size - 5;
8277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->ui32TempBuff = 0;
8297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->i8BitCnt = 0;
8307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->pui8BfrPtr = (M4OSA_Int8 *)p_bs->Buffer;
8317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->ui32LastTwoBytes = 0xFFFFFFFF;
8327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        H264MCS_getBits(p_bs, 0);
8347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nal_size = ( nal_size_high16 << 16) + nal_size_low16;
8367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        frame_size += nal_size + 4;
8387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        forbidden_bit = ( nalu_info >> 7) & 1;
8407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nal_ref_idc = ( nalu_info >> 5) & 3;
8417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nal_unit_type = (nalu_info) &0x1f;
8427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        NSWAVCMCS_initBitstream(&instance->encbs);
8447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->encbs.streamBuffer = outbuff + outbuffpos + 1;
8467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( nal_unit_type == 8 )
8487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
8497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("Error : PPS");
8507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return 0;
8517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
8527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( nal_unit_type == 7 )
8547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
8557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*SPS Packet */
8567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("Error : SPS");
8577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return 0;
8587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
8597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (nal_unit_type == 5) )
8617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
8627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            instance->frame_count = 0;
8637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            instance->POC_lsb = 0;
8647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
8657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( nal_unit_type == 1) || (nal_unit_type == 5) )
8677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
8687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            first_mb_in_slice = H264MCS_DecVLCReadExpGolombCode(p_bs);
8697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            slice_type = H264MCS_DecVLCReadExpGolombCode(p_bs);
8707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pic_parameter_set_id = H264MCS_DecVLCReadExpGolombCode(p_bs);
8717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* First MB in slice */
8737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            NSWAVCMCS_uExpVLC(&instance->encbs, first_mb_in_slice);
8747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Slice Type */
8767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            NSWAVCMCS_uExpVLC(&instance->encbs, slice_type);
8777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Picture Parameter set Id */
8797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pic_parameter_set_id = instance->encoder_pps.pic_parameter_set_id;
8807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            NSWAVCMCS_uExpVLC(&instance->encbs, pic_parameter_set_id);
8817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = H264MCS_getBits(p_bs,
8837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                instance->encoder_sps.log2_max_frame_num_minus4 + 4);
8847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            NSWAVCMCS_putBits(&instance->encbs, instance->frame_count,
8857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                instance->clip_sps.log2_max_frame_num_minus4 + 4);
8867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // In Baseline Profile: frame_mbs_only_flag should be ON
8887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( nal_unit_type == 5 )
8897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
8907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = H264MCS_DecVLCReadExpGolombCode(p_bs);
8917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                NSWAVCMCS_uExpVLC(&instance->encbs, temp);
8927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
8937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( instance->encoder_sps.pic_order_cnt_type == 0 )
8957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
8967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = H264MCS_getBits(p_bs,
8977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    instance->encoder_sps.log2_max_pic_order_cnt_lsb_minus4
8987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    + 4);
8997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                // in baseline profile field_pic_flag should be off.
9017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( instance->encoder_pps.pic_order_present_flag )
9027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
9037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    temp = H264MCS_DecVLCReadSignedExpGolombCode(p_bs);
9047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
9057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
9067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( ( instance->encoder_sps.pic_order_cnt_type == 1)
9087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                && (instance->encoder_sps.delta_pic_order_always_zero_flag) )
9097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
9107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = H264MCS_DecVLCReadSignedExpGolombCode(p_bs);
9117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                // in baseline profile field_pic_flag should be off.
9137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( instance->encoder_pps.pic_order_present_flag )
9147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
9157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    temp = H264MCS_DecVLCReadSignedExpGolombCode(p_bs);
9167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
9177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
9187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( instance->clip_sps.pic_order_cnt_type == 0 )
9207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
9217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                NSWAVCMCS_putBits(&instance->encbs, instance->POC_lsb,
9227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    instance->clip_sps.log2_max_pic_order_cnt_lsb_minus4 + 4);
9237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                // in baseline profile field_pic_flag should be off.
9257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( instance->encoder_pps.pic_order_present_flag )
9267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
9277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    NSWAVCMCS_sExpVLC(&instance->encbs, 0);
9287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
9297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
9307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( ( instance->clip_sps.pic_order_cnt_type == 1)
9327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                && (instance->clip_sps.delta_pic_order_always_zero_flag) )
9337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
9347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                NSWAVCMCS_sExpVLC(&instance->encbs, 0);
9357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                // in baseline profile field_pic_flag should be off.
9377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( instance->encoder_pps.pic_order_present_flag )
9387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
9397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    NSWAVCMCS_sExpVLC(&instance->encbs, 0);
9407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
9417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
9427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            cnt = p_bs->bitPos & 0x7;
9447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( cnt )
9467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
9477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                cnt = 8 - cnt;
9487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = H264MCS_getBits(p_bs, cnt);
9497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                NSWAVCMCS_putBits(&instance->encbs, temp, cnt);
9507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
9517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            cnt = p_bs->bitPos >> 3;
9537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            while( cnt < (nal_size - 2) )
9557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
9567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = H264MCS_getBits(p_bs, 8);
9577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                NSWAVCMCS_putBits(&instance->encbs, temp, 8);
9587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                cnt = p_bs->bitPos >> 3;
9597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
9607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = H264MCS_getBits(p_bs, 8);
9627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( temp != 0 )
9647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
9657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                cnt = 0;
9667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                while( ( temp & 0x1) == 0 )
9687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
9697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    cnt++;
9707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    temp = temp >> 1;
9717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
9727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                cnt++;
9737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = temp >> 1;
9747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( 8 - cnt )
9767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
9777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    NSWAVCMCS_putBits(&instance->encbs, temp, (8 - cnt));
9787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
9797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                NSWAVCMCS_putRbspTbits(&instance->encbs);
9817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
9827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
9837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
9847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
9867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "H264MCS_ProcessEncodedNALU : 13 temp = 0 trailing bits = %d",
9877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    instance->encbs.bitPos % 8);
9887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( instance->encbs.bitPos % 8 )
9907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
9917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    NSWAVCMCS_putBits(&instance->encbs, 0,
9927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (8 - instance->encbs.bitPos % 8));
9937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
9947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
9957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = instance->encbs.byteCnt;
9977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = temp + 1;
9987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
9997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            outbuffpos = outbuffpos + temp;
10007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
10017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
10027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *outbuf_size = outbuffpos;
10047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    instance->POC_lsb = instance->POC_lsb + 1;
10067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( instance->POC_lsb == instance->POC_lsb_mod )
10087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
10097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->POC_lsb = 0;
10107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
10117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    instance->frame_count = instance->frame_count + 1;
10127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( instance->frame_count == instance->frame_mod_count )
10147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
10157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->frame_count = 0;
10167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
10177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // StageFright encoder does not provide the size in the first 4 bytes of the AU, add it
10197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1020694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu    free(pTmpBuff1);
10217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pTmpBuff1 = M4OSA_NULL;
10227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    inbuff = (M4OSA_UInt8 *)pTmpBuff2;
10237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
10257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
10267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_Int32 DecSPSMCS( ComBitStreamMCS_t *p_bs,
10287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                      ComSequenceParameterSet_t_MCS *sps )
10297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
10307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 i;
10317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 temp_max_dpb_size;
10327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 nb_ignore_bits;
10337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 error;
10347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 profile_idc, level_idc, reserved_zero_4bits,
10357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        seq_parameter_set_id;
10367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 constraint_set0_flag, constraint_set1_flag,
10377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        constraint_set2_flag, constraint_set3_flag;
10387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->profile_idc = (M4OSA_UInt8)H264MCS_getBits(p_bs, 8);
10407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->constraint_set0_flag = (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
10417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->constraint_set1_flag = (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
10427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->constraint_set2_flag = (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
10437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->constraint_set3_flag = (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
10447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    reserved_zero_4bits = (M4OSA_UInt8)H264MCS_getBits(p_bs, 4);
10457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->level_idc = (M4OSA_UInt8)H264MCS_getBits(p_bs, 8);
10467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->seq_parameter_set_id =
10477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt8)H264MCS_DecVLCReadExpGolombCode(p_bs);
10487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->log2_max_frame_num_minus4 =
10497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt8)H264MCS_DecVLCReadExpGolombCode(p_bs);
10507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->MaxFrameNum = 1 << (sps->log2_max_frame_num_minus4 + 4);
10517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->pic_order_cnt_type =
10527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt8)H264MCS_DecVLCReadExpGolombCode(p_bs);
10537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (sps->pic_order_cnt_type == 0)
10557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
10567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->log2_max_pic_order_cnt_lsb_minus4 =
10577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt8)H264MCS_DecVLCReadExpGolombCode(p_bs);
10587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->MaxPicOrderCntLsb =
10597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            1 << (sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
10607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
10617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( sps->pic_order_cnt_type == 1 )
10627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
10637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->delta_pic_order_always_zero_flag =
10647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
10657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // This fix should be generic to remove codec dependency
10677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->offset_for_non_ref_pic =
10697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            H264MCS_DecVLCReadSignedExpGolombCode(p_bs);
10707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->offset_for_top_to_bottom_field =
10717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            H264MCS_DecVLCReadSignedExpGolombCode(p_bs);
10727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*num_ref_frames_in_pic_order_cnt_cycle must be in the range 0, 255*/
10757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->num_ref_frames_in_pic_order_cnt_cycle =
10777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt8)H264MCS_DecVLCReadExpGolombCode(p_bs);
10787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* compute deltaPOC */
10807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->expectedDeltaPerPicOrderCntCycle = 0;
10817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        for ( i = 0; i < sps->num_ref_frames_in_pic_order_cnt_cycle; i++ )
10837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
10847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // This fix should be generic to remove codec dependency
10857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            sps->offset_for_ref_frame[i] =
10867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                H264MCS_DecVLCReadSignedExpGolombCode(p_bs);
10877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            sps->expectedDeltaPerPicOrderCntCycle +=
10897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                sps->offset_for_ref_frame[i];
10907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
10917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
10927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* num_ref_frames must be in the range 0,16 */
10947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->num_ref_frames = (M4OSA_UInt8)H264MCS_DecVLCReadExpGolombCode(p_bs);
10957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->gaps_in_frame_num_value_allowed_flag =
10967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
10977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
10987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->pic_width_in_mbs_minus1 =
10997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt16)H264MCS_DecVLCReadExpGolombCode(p_bs);
11007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->pic_height_in_map_units_minus1 =
11017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt16)H264MCS_DecVLCReadExpGolombCode(p_bs);
11027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->frame_mbs_only_flag = (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
11047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (!sps->frame_mbs_only_flag)
11067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
11077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->mb_adaptive_frame_field_flag =
11087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
11097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
11107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
11117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
11127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->mb_adaptive_frame_field_flag = 0;
11137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
11147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->PicWidthInMbs = sps->pic_width_in_mbs_minus1 + 1;
11167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->FrameHeightInMbs = ( 2 - sps->frame_mbs_only_flag) * \
11177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (sps->pic_height_in_map_units_minus1 + 1);
11187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _CAP_FMO_
11197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->NumSliceGroupMapUnits =
11217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->PicWidthInMbs * (sps->pic_height_in_map_units_minus1 + 1);
11227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->MaxPicSizeInMbs = sps->PicWidthInMbs * sps->FrameHeightInMbs;
11237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_CAP_FMO_*/
11257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->direct_8x8_inference_flag = (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
11277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( sps->frame_mbs_only_flag == 0 )
11297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->direct_8x8_inference_flag = 1;
11307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->frame_cropping_flag = (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
11327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( sps->frame_cropping_flag )
11347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
11357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->frame_crop_left_offset = H264MCS_DecVLCReadExpGolombCode(p_bs);
11367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->frame_crop_right_offset = H264MCS_DecVLCReadExpGolombCode(p_bs);
11377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->frame_crop_top_offset = H264MCS_DecVLCReadExpGolombCode(p_bs);
11387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->frame_crop_bottom_offset = H264MCS_DecVLCReadExpGolombCode(p_bs);
11397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
11407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
11417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
11427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->frame_crop_left_offset = 0;
11437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->frame_crop_right_offset = 0;
11447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->frame_crop_top_offset = 0;
11457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sps->frame_crop_bottom_offset = 0;
11467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
11477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    sps->vui_parameters_present_flag = (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
11497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (sps->vui_parameters_present_flag) {
11517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* no error message as stream can be decoded without VUI messages */
11527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
11537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
11557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
11567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_Int32 DecPPSMCS( ComBitStreamMCS_t *p_bs,
11587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                      ComPictureParameterSet_t_MCS *pps )
11597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
11607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 error;
11617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 pic_parameter_set_id;
11627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _CAP_FMO_
11647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 i, length, v;
11657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
11667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 nb_ignore_bits;
11687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pic_parameter_set_id = H264MCS_DecVLCReadExpGolombCode(p_bs);
11707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->pic_parameter_set_id = (M4OSA_UInt8)pic_parameter_set_id;
11717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->seq_parameter_set_id =
11737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt8)H264MCS_DecVLCReadExpGolombCode(p_bs);
11747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* entropy_coding_mode_flag must be 0 or 1 */
11767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->entropy_coding_mode_flag = (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
11777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->pic_order_present_flag = (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
11787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->num_slice_groups_minus1 =
11807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt8)H264MCS_DecVLCReadExpGolombCode(p_bs);
11817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _CAP_FMO_
11837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* FMO stuff begins here */
11847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->map_initialized = FALSE;
11867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pps->num_slice_groups_minus1 > 0 )
11887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
11897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pps->slice_group_map_type =
11907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt8)H264MCS_DecVLCReadExpGolombCode(p_bs);
11917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
11927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pps->slice_group_map_type )
11937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
11947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 0:
11957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                for ( i = 0; i <= pps->num_slice_groups_minus1; i++ )
11967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
11977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pps->run_length_minus1[i] =
11987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_UInt16)H264MCS_DecVLCReadExpGolombCode(p_bs);
11997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
12007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
12017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 2:
12037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                for ( i = 0; i < pps->num_slice_groups_minus1; i++ )
12047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
12057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pps->top_left[i] =
12067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_UInt16)H264MCS_DecVLCReadExpGolombCode(p_bs);
12077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pps->bottom_right[i] =
12087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_UInt16)H264MCS_DecVLCReadExpGolombCode(p_bs);
12097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
12107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
12117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 3:
12137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 4:
12147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 5:
12157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pps->slice_group_change_direction_flag =
12167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
12177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pps->slice_group_change_rate_minus1 =
12187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_UInt16)H264MCS_DecVLCReadExpGolombCode(p_bs);
12197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
12207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 6:
12227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pps->pic_size_in_map_units_minus1 =
12237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_UInt16)H264MCS_DecVLCReadExpGolombCode(p_bs);
12247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pps->slice_group_id = (H264UInt8
12267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *)M4H264Dec_malloc((pps->pic_size_in_map_units_minus1
12277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    + 1), M4H264_COREID, (M4OSA_Char *)"PPS");
12287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if (M4OSA_NULL == pps->slice_group_id)
12307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
12317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_0("DecPPSMCS: allocation error");
12327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4ERR_ALLOC;
12337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
12347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                for ( length = 0, v = pps->num_slice_groups_minus1 + 1; v != 0;
12367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    v >>= 1, length++ );
12377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    for ( i = 0; i <= pps->pic_size_in_map_units_minus1; i++ )
12397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
12407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pps->slice_group_id[i] =
12417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (M4OSA_UInt8)getBits(p_vlc_engine->p_bs, length);
12427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
12437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
12447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
12457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
12467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
12477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
12487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pps->slice_group_map_type = 0;
12497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
12507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* End of FMO stuff */
12517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else
12537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* _CAP_FMO_ */
12557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* num_ref_idx_l0_active_minus1 must be in the range 0, 31 */
12577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->num_ref_idx_l0_active_minus1 =
12597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt8)H264MCS_DecVLCReadExpGolombCode(p_bs);
12607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* num_ref_idx_l1_active_minus1 must be in the range 0, 31 */
12617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->num_ref_idx_l1_active_minus1 =
12627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt8)H264MCS_DecVLCReadExpGolombCode(p_bs);
12637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->weighted_pred_flag = (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
12647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* weighted_bipred_idc must be in the range 0,2 */
12667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->weighted_bipred_idc = (M4OSA_Bool)H264MCS_getBits(p_bs, 2);
12677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* pic_init_qp_minus26 must be in the range -26,25 */
12697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->pic_init_qp_minus26 =
12707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Int16)H264MCS_DecVLCReadSignedExpGolombCode(p_bs);
12717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* pic_init_qs_minus26 must be in the range -26,25 */
12737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->pic_init_qs_minus26 =
12747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Int16)H264MCS_DecVLCReadSignedExpGolombCode(p_bs);
12757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* chroma_qp_index_offset must be in the range -12,+12 */
12777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->chroma_qp_index_offset =
12787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Int16)H264MCS_DecVLCReadSignedExpGolombCode(p_bs);
12797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->deblocking_filter_control_present_flag =
12807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
12817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->constrained_intra_pred_flag = (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
12827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pps->redundant_pic_cnt_present_flag = (M4OSA_Bool)H264MCS_getBits(p_bs, 1);
12837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
12857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
12867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR H264MCS_ProcessSPS_PPS( NSWAVC_MCS_t *instance, M4OSA_UInt8 *inbuff,
12887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 M4OSA_Int32 inbuf_size )
12897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
12907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    ComBitStreamMCS_t *p_bs, bs;
12917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    ComBitStreamMCS_t *p_bs1, bs1;
12927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
12937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 nalu_info = 0;
12947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 forbidden_bit, nal_ref_idc, nal_unit_type;
12957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 first_mb_in_slice, slice_type, pic_parameter_set_id = 0,
12967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        frame_num;
12977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 seq_parameter_set_id;
12987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 temp1, temp2, temp3, temp4;
12997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 temp_frame_num;
13007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 bitstoDiacard, bytes;
13017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 mask_bits = 0xFFFFFFFF;
13027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 new_bytes, init_bit_pos;
13037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 nal_size = 0;
13047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 cnt, cnt1;
13057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 outbuffpos = 0;
13067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 nal_size_low16, nal_size_high16;
13077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 frame_size = 0;
13087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 temp = 0;
13097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 *lClipDSI;
13107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 *lClipDSI_PPS_start;
13117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 lClipDSI_PPS_offset = 0;
13127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 *lPPS_Buffer = M4OSA_NULL;
13147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 lPPS_Buffer_Size = 0;
13157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 lSize, lSize1;
13177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 lActiveSPSID_Clip;
13187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 lClipPPSRemBits = 0;
13197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 lEncoder_SPSID = 0;
13217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 lEncoder_PPSID = 0;
13227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 lEncoderPPSRemBits = 0;
13237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 lFound = 0;
13247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 size;
13257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 Clip_SPSID[32] = { 0 };
13277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 Clip_UsedSPSID[32] = { 0 };
13287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 Clip_PPSID[256] = { 0 };
13297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 Clip_SPSID_in_PPS[256] = { 0 };
13307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 Clip_UsedPPSID[256] = { 0 };
13317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
13327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs = &bs;
13347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs1 = &bs1;
13357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Find the active SPS ID */
13377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == instance), M4ERR_PARAMETER,
13387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "H264MCS_ProcessSPS_PPS: instance is M4OSA_NULL");
13397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1340c84b947d802116d64ca11087cfbc52fabd3c7109James Dong    instance->m_Num_Bytes_NALUnitLength =
1341c84b947d802116d64ca11087cfbc52fabd3c7109James Dong            (instance->m_pDecoderSpecificInfo[4] & 0x03) + 1;
13427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    instance->m_encoder_SPS_Cnt = instance->m_pDecoderSpecificInfo[5] & 0x1F;
13447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    lClipDSI = instance->m_pDecoderSpecificInfo + 6;
13467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    lClipDSI_PPS_offset = 6;
13487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for ( cnt = 0; cnt < instance->m_encoder_SPS_Cnt; cnt++ )
13507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
13517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lSize = ( lClipDSI[0] << 8) + lClipDSI[1];
13527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lClipDSI = lClipDSI + 2;
13537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->Buffer = (M4OSA_UInt8 *)(lClipDSI + 4);
13557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        DecBitStreamReset_MCS(p_bs, lSize - 4);
13567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        Clip_SPSID[cnt] = H264MCS_DecVLCReadExpGolombCode(p_bs);
13587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        Clip_UsedSPSID[Clip_SPSID[cnt]] = 1;
13597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lClipDSI = lClipDSI + lSize;
13617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lClipDSI_PPS_offset = lClipDSI_PPS_offset + 2 + lSize;
13627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
13637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    instance->m_encoder_PPS_Cnt = lClipDSI[0];
13657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    lClipDSI = lClipDSI + 1;
13667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    lClipDSI_PPS_start = lClipDSI;
13687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for ( cnt = 0; cnt < instance->m_encoder_PPS_Cnt; cnt++ )
13707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
13717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lSize = ( lClipDSI[0] << 8) + lClipDSI[1];
13727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lClipDSI = lClipDSI + 2;
13737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->Buffer = (M4OSA_UInt8 *)(lClipDSI + 1);
13757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        DecBitStreamReset_MCS(p_bs, lSize - 1);
13767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        Clip_PPSID[cnt] = H264MCS_DecVLCReadExpGolombCode(p_bs);
13787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        Clip_UsedPPSID[Clip_PPSID[cnt]] = 1;
13797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        Clip_SPSID_in_PPS[Clip_PPSID[cnt]] =
13807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            H264MCS_DecVLCReadExpGolombCode(p_bs);
13817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lClipDSI = lClipDSI + lSize;
13837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
13847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Find the clip SPS ID used at the cut start frame */
13867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while( ( (M4OSA_Int32)frame_size) < inbuf_size )
13877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
13887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mask_bits = 0xFFFFFFFF;
13897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->Buffer = (M4OSA_UInt8 *)(inbuff + frame_size);
13907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( instance->m_Num_Bytes_NALUnitLength )
13927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
13937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 1:
13947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                nal_size = (unsigned char)p_bs->Buffer[0];
13957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                nalu_info = (unsigned char)p_bs->Buffer[1];
13967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                p_bs->Buffer = p_bs->Buffer + 2;
13977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
13987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
13997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 2:
14017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                nal_size_high16 = ( p_bs->Buffer[0] << 8) + p_bs->Buffer[1];
14027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                nal_size = nal_size_high16;
14037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                nalu_info = (unsigned char)p_bs->Buffer[2];
14047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                p_bs->Buffer = p_bs->Buffer + 3;
14057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
14077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case 4:
14097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                nal_size_high16 = ( p_bs->Buffer[0] << 8) + p_bs->Buffer[1];
14107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                nal_size_low16 = ( p_bs->Buffer[2] << 8) + p_bs->Buffer[3];
14117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                nal_size = ( nal_size_high16 << 16) + nal_size_low16;
14127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                nalu_info = (unsigned char)p_bs->Buffer[4];
14137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                p_bs->Buffer = p_bs->Buffer + 5;
14147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
14167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
14177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1418c84b947d802116d64ca11087cfbc52fabd3c7109James Dong        if (nal_size == 0) {
1419c84b947d802116d64ca11087cfbc52fabd3c7109James Dong            M4OSA_TRACE1_1("0 size nal unit at line %d", __LINE__);
1420c84b947d802116d64ca11087cfbc52fabd3c7109James Dong            frame_size += instance->m_Num_Bytes_NALUnitLength;
1421c84b947d802116d64ca11087cfbc52fabd3c7109James Dong            continue;
1422c84b947d802116d64ca11087cfbc52fabd3c7109James Dong        }
1423c84b947d802116d64ca11087cfbc52fabd3c7109James Dong
14247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->bitPos = 0;
14257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->lastTotalBits = 0;
14267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->numBitsInBuffer =
14277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ( inbuf_size - frame_size - instance->m_Num_Bytes_NALUnitLength - 1)
14287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            << 3;
14297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->readableBytesInBuffer =
14307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            inbuf_size - frame_size - instance->m_Num_Bytes_NALUnitLength - 1;
14317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->ui32TempBuff = 0;
14337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->i8BitCnt = 0;
14347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->pui8BfrPtr = (M4OSA_Int8 *)p_bs->Buffer;
14357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->ui32LastTwoBytes = 0xFFFFFFFF;
14367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        H264MCS_getBits(p_bs, 0);
14387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        frame_size += nal_size + instance->m_Num_Bytes_NALUnitLength;
14407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        forbidden_bit = ( nalu_info >> 7) & 1;
14427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nal_ref_idc = ( nalu_info >> 5) & 3;
14437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nal_unit_type = (nalu_info) &0x1f;
14447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( nal_unit_type == 8 )
14467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
14477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("H264MCS_ProcessSPS_PPS() Error: PPS");
14487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
14497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
14507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( nal_unit_type == 7 )
14527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
14537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*SPS Packet */
14547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("H264MCS_ProcessSPS_PPS() Error: SPS");
14557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
14567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
14577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( nal_unit_type == 1) || (nal_unit_type == 5) )
14597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
14607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            first_mb_in_slice = H264MCS_DecVLCReadExpGolombCode(p_bs);
14617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            slice_type = H264MCS_DecVLCReadExpGolombCode(p_bs);
14627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pic_parameter_set_id = H264MCS_DecVLCReadExpGolombCode(p_bs);
14637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
14647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
14657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
14667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    lActiveSPSID_Clip = Clip_SPSID_in_PPS[pic_parameter_set_id];
14687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    instance->final_SPS_ID = lActiveSPSID_Clip;
14707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Do we need to add encoder PPS to clip PPS */
14717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    lClipDSI = lClipDSI_PPS_start;
14737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for ( cnt = 0; cnt < instance->m_encoder_PPS_Cnt; cnt++ )
14757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
14767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lSize = ( lClipDSI[0] << 8) + lClipDSI[1];
14777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lClipDSI = lClipDSI + 2;
14787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( lActiveSPSID_Clip == Clip_SPSID_in_PPS[Clip_PPSID[cnt]] )
14807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
14817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lPPS_Buffer = lClipDSI + 1;
14827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lPPS_Buffer_Size = lSize - 1;
14837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            p_bs->Buffer = (M4OSA_UInt8 *)(lClipDSI + 1);
14857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            DecBitStreamReset_MCS(p_bs, lSize - 1);
14867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            Clip_PPSID[cnt] = H264MCS_DecVLCReadExpGolombCode(p_bs);
14887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            Clip_UsedPPSID[Clip_SPSID[cnt]] = 1;
14897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            Clip_SPSID_in_PPS[cnt] = H264MCS_DecVLCReadExpGolombCode(p_bs);
14907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lClipPPSRemBits = ( lSize - 1) << 3;
14917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lClipPPSRemBits -= p_bs->bitPos;
14927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = lClipDSI[lSize - 1];
14947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            cnt1 = 0;
14967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
14977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            while( ( temp & 0x1) == 0 )
14987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
14997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                cnt1++;
15007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = temp >> 1;
15017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
15027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            cnt1++;
15037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lClipPPSRemBits -= cnt1;
15047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lSize1 = instance->m_encoderPPSSize - 1;
15067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            p_bs1->Buffer = (M4OSA_UInt8 *)(instance->m_pEncoderPPS + 1);
15077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            DecBitStreamReset_MCS(p_bs1, lSize1);
15087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lEncoder_PPSID = H264MCS_DecVLCReadExpGolombCode(p_bs1);
15107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lEncoder_SPSID = H264MCS_DecVLCReadExpGolombCode(p_bs1);
15117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lEncoderPPSRemBits = ( lSize1) << 3;
15137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lEncoderPPSRemBits -= p_bs1->bitPos;
15147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = instance->m_pEncoderPPS[lSize1];
15167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            cnt1 = 0;
15187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            while( ( temp & 0x1) == 0 )
15207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
15217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                cnt1++;
15227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = temp >> 1;
15237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
15247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            cnt1++;
15257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lEncoderPPSRemBits -= cnt1;
15267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( lEncoderPPSRemBits == lClipPPSRemBits )
15287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
15297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                while( lEncoderPPSRemBits > 8 )
15307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
15317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    temp1 = H264MCS_getBits(p_bs, 8);
15327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    temp2 = H264MCS_getBits(p_bs1, 8);
15337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    lEncoderPPSRemBits = lEncoderPPSRemBits - 8;
15347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( temp1 != temp2 )
15367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
15377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
15387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
15397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
15407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( lEncoderPPSRemBits < 8 )
15427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
15437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( lEncoderPPSRemBits )
15447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
15457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        temp1 = H264MCS_getBits(p_bs, lEncoderPPSRemBits);
15467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        temp2 = H264MCS_getBits(p_bs1, lEncoderPPSRemBits);
15477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( temp1 == temp2 )
15497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
15507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            lFound = 1;
15517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
15527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
15537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else
15547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
15557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        lFound = 1;
15567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
15577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
15587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
15597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
15607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
15617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lClipDSI = lClipDSI + lSize;
15637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
15647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Form the final SPS and PPS data */
15667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( lFound == 1 )
15687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
15697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* No need to add PPS */
15707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->final_PPS_ID = Clip_PPSID[cnt];
15717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->m_pFinalDSI =
1573694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc(instance->m_decoderSpecificInfoSize,
15747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS, (M4OSA_Char *)"instance->m_pFinalDSI");
15757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( instance->m_pFinalDSI == M4OSA_NULL )
15777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
15787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("instance->m_pFinalDSI: allocation error");
15797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
15807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
15817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->m_pFinalDSISize = instance->m_decoderSpecificInfoSize;
158332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)instance->m_pFinalDSI,
158432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *)instance->m_pDecoderSpecificInfo,
15857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            instance->m_decoderSpecificInfoSize);
15867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
15877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
15887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
15897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* ADD PPS */
15907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* find the free PPS ID */
15917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        cnt = 0;
15937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
15947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        while( Clip_UsedPPSID[cnt] )
15957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
15967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            cnt++;
15977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
15987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->final_PPS_ID = cnt;
15997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        size = instance->m_decoderSpecificInfoSize + instance->m_encoderPPSSize
16017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            + 10;
16027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1603694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        instance->m_pFinalDSI = (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc(size, M4MCS,
16047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Char *)"instance->m_pFinalDSI");
16057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( instance->m_pFinalDSI == M4OSA_NULL )
16077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
16087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("instance->m_pFinalDSI: allocation error");
16097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
16107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
16117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
161232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)instance->m_pFinalDSI,
161332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *)instance->m_pDecoderSpecificInfo,
16147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            instance->m_decoderSpecificInfoSize);
16157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        temp = instance->m_pFinalDSI[lClipDSI_PPS_offset];
16177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        temp = temp + 1;
16187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->m_pFinalDSI[lClipDSI_PPS_offset] = temp;
16197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //temp = instance->m_pEncoderPPS[0];
16217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lSize1 = instance->m_encoderPPSSize - 1;
16227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs1->Buffer = (M4OSA_UInt8 *)(instance->m_pEncoderPPS + 1);
16237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        DecBitStreamReset_MCS(p_bs1, lSize1);
16247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lEncoder_PPSID = H264MCS_DecVLCReadExpGolombCode(p_bs1);
16267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lEncoder_SPSID = H264MCS_DecVLCReadExpGolombCode(p_bs1);
16277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lEncoderPPSRemBits = ( lSize1) << 3;
16297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lEncoderPPSRemBits -= p_bs1->bitPos;
16307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        temp = instance->m_pEncoderPPS[lSize1];
16327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        cnt1 = 0;
16347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        while( ( temp & 0x1) == 0 )
16367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
16377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            cnt1++;
16387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = temp >> 1;
16397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
16407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        cnt1++;
16417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lEncoderPPSRemBits -= cnt1;
16427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->m_pFinalDSI[instance->m_decoderSpecificInfoSize + 2] =
16447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            instance->m_pEncoderPPS[0];
16457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        NSWAVCMCS_initBitstream(&instance->encbs);
16477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->encbs.streamBuffer =
16487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &(instance->m_pFinalDSI[instance->m_decoderSpecificInfoSize + 3]);
16497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lPPS_Buffer = instance->encbs.streamBuffer;
16507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        NSWAVCMCS_uExpVLC(&instance->encbs, instance->final_PPS_ID);
16527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        NSWAVCMCS_uExpVLC(&instance->encbs, instance->final_SPS_ID);
16537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        while( lEncoderPPSRemBits > 8 )
16557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
16567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = H264MCS_getBits(p_bs1, 8);
16577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            NSWAVCMCS_putBits(&instance->encbs, temp, 8);
16587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lEncoderPPSRemBits = lEncoderPPSRemBits - 8;
16597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
16607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( lEncoderPPSRemBits )
16627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
16637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = H264MCS_getBits(p_bs1, lEncoderPPSRemBits);
16647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            NSWAVCMCS_putBits(&instance->encbs, temp, lEncoderPPSRemBits);
16657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
16667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        NSWAVCMCS_putRbspTbits(&instance->encbs);
16677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        temp = instance->encbs.byteCnt;
16697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lPPS_Buffer_Size = temp;
16707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        temp = temp + 1;
16717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->m_pFinalDSI[instance->m_decoderSpecificInfoSize] =
16737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ( temp >> 8) & 0xFF;
16747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->m_pFinalDSI[instance->m_decoderSpecificInfoSize + 1] =
16757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (temp) &0xFF;
16767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->m_pFinalDSISize =
16777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            instance->m_decoderSpecificInfoSize + 2 + temp;
16787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
16797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Decode the clip SPS */
16817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    lClipDSI = instance->m_pDecoderSpecificInfo + 6;
16837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    lClipDSI_PPS_offset = 6;
16857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for ( cnt = 0; cnt < instance->m_encoder_SPS_Cnt; cnt++ )
16877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
16887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lSize = ( lClipDSI[0] << 8) + lClipDSI[1];
16897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lClipDSI = lClipDSI + 2;
16907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( Clip_SPSID[cnt] == instance->final_SPS_ID )
16927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
16937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            p_bs->Buffer = (M4OSA_UInt8 *)(lClipDSI + 1);
16947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            DecBitStreamReset_MCS(p_bs, lSize - 1);
16957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
16966e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury            err = DecSPSMCS(p_bs, &instance->clip_sps);
16976e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury            if(err != M4NO_ERROR) {
16986e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury                return M4ERR_PARAMETER;
16996e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury            }
17007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //Clip_SPSID[cnt] = H264MCS_DecVLCReadExpGolombCode(p_bs);
17027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //Clip_UsedSPSID[Clip_SPSID[cnt]] = 1;
17037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
17047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
17057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        lClipDSI = lClipDSI + lSize;
17077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
17087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Decode encoder SPS */
17107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->Buffer = (M4OSA_UInt8 *)(instance->m_pEncoderSPS + 1);
17117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    DecBitStreamReset_MCS(p_bs, instance->m_encoderSPSSize - 1);
17126e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury    err = DecSPSMCS(p_bs, &instance->encoder_sps);
17136e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury    if(err != M4NO_ERROR) {
17146e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury        return M4ERR_PARAMETER;
17156e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury    }
17167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( instance->encoder_sps.num_ref_frames
17187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    > instance->clip_sps.num_ref_frames )
17197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
17207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return 100; //not supported
17217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
17227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs->Buffer = (M4OSA_UInt8 *)lPPS_Buffer;
17247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    DecBitStreamReset_MCS(p_bs, lPPS_Buffer_Size);
17257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    DecPPSMCS(p_bs, &instance->encoder_pps);
17267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    instance->frame_count = 0;
17287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    instance->frame_mod_count =
17297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        1 << (instance->clip_sps.log2_max_frame_num_minus4 + 4);
17307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    instance->POC_lsb = 0;
17327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    instance->POC_lsb_mod =
17337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        1 << (instance->clip_sps.log2_max_pic_order_cnt_lsb_minus4 + 4);
17347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
17367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
17377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR H264MCS_ProcessNALU( NSWAVC_MCS_t *ainstance, M4OSA_UInt8 *inbuff,
17397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                               M4OSA_Int32 inbuf_size, M4OSA_UInt8 *outbuff,
17407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                               M4OSA_Int32 *outbuf_size )
17417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
17427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    ComBitStreamMCS_t *p_bs, bs;
17437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    NSWAVC_MCS_t *instance;
17447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 nalu_info;
17457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 forbidden_bit, nal_ref_idc, nal_unit_type;
17467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 first_mb_in_slice, slice_type, pic_parameter_set_id, frame_num;
17477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 seq_parameter_set_id;
17487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 temp1, temp2, temp3, temp4;
17497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 temp_frame_num;
17507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 bitstoDiacard, bytes;
17517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 mask_bits = 0xFFFFFFFF;
17527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 new_bytes, init_bit_pos;
17537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 nal_size;
17547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 cnt;
17557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 outbuffpos = 0;
17567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    //#ifndef DGR_FIX // + new
17577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 nal_size_low16, nal_size_high16;
17587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    //#endif // + end new
17597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 frame_size = 0;
17607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 temp = 0;
17617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
17627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 *buff;
17637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    p_bs = &bs;
17657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    instance = (NSWAVC_MCS_t *)ainstance;
17667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == instance), M4ERR_PARAMETER,
17677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "H264MCS_ProcessNALU: instance is M4OSA_NULL");
17687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( instance->is_done )
17707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
17717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    inbuff[0] = 0x00;
17737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    inbuff[1] = 0x00;
17747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    inbuff[2] = 0x00;
17757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    inbuff[3] = 0x01;
17767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while( (M4OSA_Int32)frame_size < inbuf_size )
17797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
17807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mask_bits = 0xFFFFFFFF;
17817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->Buffer = (M4OSA_UInt8 *)(inbuff + frame_size);
17827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nalu_info = (unsigned char)p_bs->Buffer[4];
17857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outbuff[outbuffpos] = p_bs->Buffer[0];
17877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outbuff[outbuffpos + 1] = p_bs->Buffer[1];
17887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outbuff[outbuffpos + 2] = p_bs->Buffer[2];
17897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outbuff[outbuffpos + 3] = p_bs->Buffer[3];
17907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outbuff[outbuffpos + 4] = p_bs->Buffer[4];
17917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->Buffer = p_bs->Buffer + 5;
17937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->bitPos = 0;
17957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->lastTotalBits = 0;
17967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->numBitsInBuffer = ( inbuf_size - frame_size - 5) << 3;
17977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->readableBytesInBuffer = inbuf_size - frame_size - 5;
17987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
17997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->ui32TempBuff = 0;
18007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->i8BitCnt = 0;
18017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->pui8BfrPtr = (M4OSA_Int8 *)p_bs->Buffer;
18027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        p_bs->ui32LastTwoBytes = 0xFFFFFFFF;
18037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        H264MCS_getBits(p_bs, 0);
18057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nal_size = inbuf_size - frame_size - 4;
18097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        buff = inbuff + frame_size + 4;
18107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        while( nal_size > 4 )
18127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
18137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( ( buff[0] == 0x00) && (buff[1] == 0x00) && (buff[2] == 0x00)
18147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                && (buff[3] == 0x01) )
18157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
18167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
18177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            buff = buff + 1;
18197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            nal_size = nal_size - 1;
18207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( nal_size <= 4 )
18237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
18247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            nal_size = 0;
18257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nal_size = ( inbuf_size - frame_size - 4) - nal_size;
18277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //      M4OSA_TRACE1_3("H264MCS_ProcessNALU frame  input buff size = %d  current position
18297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //= %d   nal size = %d",
18307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //  inbuf_size, frame_size,  nal_size + 4);
18317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        frame_size += nal_size + 4;
18327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        forbidden_bit = ( nalu_info >> 7) & 1;
18367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nal_ref_idc = ( nalu_info >> 5) & 3;
18377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        nal_unit_type = (nalu_info) &0x1f;
18387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( nal_unit_type == 5 )
18407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
18417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*IDR/PPS Packet - Do nothing*/
18427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            instance->is_done = 1;
18437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
18447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        NSWAVCMCS_initBitstream(&instance->encbs);
18477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->encbs.streamBuffer = outbuff + outbuffpos + 5;
18487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( nal_unit_type == 8 )
18507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
18517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("H264MCS_ProcessNALU() Error: PPS");
18527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
18537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( nal_unit_type == 7 )
18567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
18577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*SPS Packet */
18587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("H264MCS_ProcessNALU() Error: SPS");
18597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return 0;
18607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (nal_unit_type == 5) )
18637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
18647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            instance->frame_count = 0;
18657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            instance->POC_lsb = 0;
18667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
18677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (nal_unit_type == 1) )
18697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
18707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            first_mb_in_slice = H264MCS_DecVLCReadExpGolombCode(p_bs);
18717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            NSWAVCMCS_uExpVLC(&instance->encbs, first_mb_in_slice);
18727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            slice_type = H264MCS_DecVLCReadExpGolombCode(p_bs);
18747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            NSWAVCMCS_uExpVLC(&instance->encbs, slice_type);
18757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pic_parameter_set_id = H264MCS_DecVLCReadExpGolombCode(p_bs);
18777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            NSWAVCMCS_uExpVLC(&instance->encbs, pic_parameter_set_id);
18787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = H264MCS_getBits(p_bs,
18807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                instance->clip_sps.log2_max_frame_num_minus4 + 4);
18817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            NSWAVCMCS_putBits(&instance->encbs, instance->frame_count,
18827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                instance->clip_sps.log2_max_frame_num_minus4 + 4);
18837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // In Baseline Profile: frame_mbs_only_flag should be ON
18857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( nal_unit_type == 5 )
18877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
18887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = H264MCS_DecVLCReadExpGolombCode(p_bs);
18897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                NSWAVCMCS_uExpVLC(&instance->encbs, temp);
18907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
18917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
18927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( instance->clip_sps.pic_order_cnt_type == 0 )
18937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
18947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = H264MCS_getBits(p_bs,
18957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    instance->clip_sps.log2_max_pic_order_cnt_lsb_minus4
18967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    + 4);
18977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                NSWAVCMCS_putBits(&instance->encbs, instance->POC_lsb,
18987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    instance->clip_sps.log2_max_pic_order_cnt_lsb_minus4 + 4);
18997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
19007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( ( instance->clip_sps.pic_order_cnt_type == 1)
19027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                && (instance->clip_sps.delta_pic_order_always_zero_flag) )
19037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
19047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = H264MCS_DecVLCReadSignedExpGolombCode(p_bs);
19057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                NSWAVCMCS_sExpVLC(&instance->encbs, temp);
19067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
19077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            cnt = p_bs->bitPos & 0x7;
19097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( cnt )
19117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
19127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                cnt = 8 - cnt;
19137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = H264MCS_getBits(p_bs, cnt);
19147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                NSWAVCMCS_putBits(&instance->encbs, temp, cnt);
19157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
19167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            cnt = p_bs->bitPos >> 3;
19187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            while( cnt < (nal_size - 2) )
19207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
19217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = H264MCS_getBits(p_bs, 8);
19227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                NSWAVCMCS_putBits(&instance->encbs, temp, 8);
19237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                cnt = p_bs->bitPos >> 3;
19247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
19257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = H264MCS_getBits(p_bs, 8);
19277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( temp != 0 )
19297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
19307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                cnt = 0;
19317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                while( ( temp & 0x1) == 0 )
19337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
19347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    cnt++;
19357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    temp = temp >> 1;
19367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
19377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                cnt++;
19387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                temp = temp >> 1;
19397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( 8 - cnt )
19417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
19427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    NSWAVCMCS_putBits(&instance->encbs, temp, (8 - cnt));
19437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
19447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                NSWAVCMCS_putRbspTbits(&instance->encbs);
19467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
19477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
19487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
19497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( instance->encbs.bitPos % 8 )
19507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
19517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    NSWAVCMCS_putBits(&instance->encbs, 0,
19527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (8 - instance->encbs.bitPos % 8));
19537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
19547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
19557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = instance->encbs.byteCnt;
19577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            temp = temp + 1;
19587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            outbuff[outbuffpos] = (M4OSA_UInt8)(( temp >> 24) & 0xFF);
19607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            outbuff[outbuffpos + 1] = (M4OSA_UInt8)(( temp >> 16) & 0xFF);
19617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            outbuff[outbuffpos + 2] = (M4OSA_UInt8)(( temp >> 8) & 0xFF);
19627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            outbuff[outbuffpos + 3] = (M4OSA_UInt8)((temp) &0xFF);
19637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            outbuffpos = outbuffpos + temp + 4;
19647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
19657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
19667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
19677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            p_bs->Buffer = p_bs->Buffer - 5;
196832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            memcpy((void *) &outbuff[outbuffpos],
196932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                (void *)p_bs->Buffer, nal_size + 4);
19707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            outbuff[outbuffpos] = (M4OSA_UInt8)((nal_size >> 24)& 0xFF);
19727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outbuff[outbuffpos + 1] = (M4OSA_UInt8)((nal_size >> 16)& 0xFF);;
19737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outbuff[outbuffpos + 2] = (M4OSA_UInt8)((nal_size >> 8)& 0xFF);;
19747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outbuff[outbuffpos + 3] = (M4OSA_UInt8)((nal_size)& 0xFF);;
19757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            outbuffpos = outbuffpos + nal_size + 4;
19777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
19787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *outbuf_size = outbuffpos;
19817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    instance->POC_lsb = instance->POC_lsb + 1;
19837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( instance->POC_lsb == instance->POC_lsb_mod )
19857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
19867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->POC_lsb = 0;
19877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    instance->frame_count = instance->frame_count + 1;
19897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( instance->frame_count == instance->frame_mod_count )
19917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
19927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->frame_count = 0;
19937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
19947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
19957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
19967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
19977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR   M4MCS_convetFromByteStreamtoNALStream(  M4OSA_UInt8 *inbuff,
19987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                    M4OSA_UInt32 inbuf_size )
19997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
20007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
20017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 framesize = 0;
20027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 nal_size =0;
20037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8 *buff;
20047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while(framesize < inbuf_size)
20077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
20087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            nal_size = inbuf_size - framesize - 4;
20097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            buff =  inbuff + framesize + 4;
20107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            while(nal_size > 4){
20127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if((buff[0] == 0x00) &&
20137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (buff[1] == 0x00) &&
20147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (buff[2] == 0x00) &&
20157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (buff[3] == 0x01)){
20167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
20177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
20187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                buff = buff + 1;
20197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                nal_size = nal_size -1;
20207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
20217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if(nal_size <= 4){
20237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                nal_size = 0;
20247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
20257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            nal_size = (inbuf_size - framesize - 4) - nal_size;
20267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        inbuff[framesize + 0]  = (M4OSA_UInt8)((nal_size >> 24)& 0xFF);
20287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        inbuff[framesize + 1]  = (M4OSA_UInt8)((nal_size >> 16)& 0xFF);
20297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        inbuff[framesize + 2]  = (M4OSA_UInt8)((nal_size >> 8)& 0xFF);
20307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        inbuff[framesize + 3]  = (M4OSA_UInt8)((nal_size )& 0xFF);
20317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        framesize += nal_size + 4;
20327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_2("M4MCS_convetFromByteStreamtoNALStream framesize = %x nalsize = %x",
20347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            framesize, nal_size)
20357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
20367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return  err;
20387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
20397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR H264MCS_Freeinstance( NSWAVC_MCS_t *instance )
20427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
20437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
20447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == instance), M4ERR_PARAMETER,
20457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "H264MCS_Freeinstance: instance is M4OSA_NULL");
20467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != instance->encoder_pps.slice_group_id )
20487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
2049694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(instance->encoder_pps.slice_group_id);
20507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
20517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != instance->p_encoder_sps )
20537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
2054694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(instance->p_encoder_sps);
20557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->p_encoder_sps = M4OSA_NULL;
20567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
20577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != instance->p_encoder_pps )
20597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
2060694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(instance->p_encoder_pps);
20617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->p_encoder_pps = M4OSA_NULL;
20627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
20637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != instance->m_pFinalDSI )
20657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
2066694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(instance->m_pFinalDSI);
20677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance->m_pFinalDSI = M4OSA_NULL;
20687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
20697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != instance )
20717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
2072694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(instance);
20737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        instance = M4OSA_NULL;
20747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
20757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
20777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
20787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
20797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
20807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_getVersion(M4_VersionInfo* pVersionInfo);
20817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Get the MCS version.
20827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note Can be called anytime. Do not need any context.
20837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pVersionInfo        (OUT) Pointer to a version info structure
20847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR:         No error
20857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4ERR_PARAMETER:    pVersionInfo is M4OSA_NULL (If Debug Level >= 2)
20867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
20877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
20887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_getVersion( M4_VersionInfo *pVersionInfo )
20897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
20907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_1("M4MCS_getVersion called with pVersionInfo=0x%x",
20917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pVersionInfo);
20927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
20947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
20957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pVersionInfo), M4ERR_PARAMETER,
20967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_getVersion: pVersionInfo is M4OSA_NULL");
20977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
20987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pVersionInfo->m_major = M4MCS_VERSION_MAJOR;
20997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pVersionInfo->m_minor = M4MCS_VERSION_MINOR;
21007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pVersionInfo->m_revision = M4MCS_VERSION_REVISION;
21017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
21037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
21047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_getVersion(): returning M4NO_ERROR");
21057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
21067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
21077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
21097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
21107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Initializes the MCS (allocates an execution context).
21117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
21127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pContext            (OUT) Pointer on the MCS context to allocate
21137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pFileReadPtrFct     (IN) Pointer to OSAL file reader functions
21147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pFileWritePtrFct    (IN) Pointer to OSAL file writer functions
21157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR:         No error
21167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (If Debug Level >= 2)
21177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4ERR_ALLOC:        There is no more available memory
21187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
21197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
21207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_init( M4MCS_Context *pContext,
21227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     M4OSA_FileReadPointer *pFileReadPtrFct,
21237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     M4OSA_FileWriterPointer *pFileWritePtrFct )
21247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
21257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = M4OSA_NULL;
21267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
21277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_3(
21297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_init called with pContext=0x%x, pFileReadPtrFct=0x%x, pFileWritePtrFct=0x%x",
21307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pContext, pFileReadPtrFct, pFileWritePtrFct);
21317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
21337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
21347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
21357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_init: pContext is M4OSA_NULL");
21367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pFileReadPtrFct), M4ERR_PARAMETER,
21377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_init: pFileReadPtrFct is M4OSA_NULL");
21387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pFileWritePtrFct), M4ERR_PARAMETER,
21397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_init: pFileWritePtrFct is M4OSA_NULL");
21407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
21427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Allocate the MCS context and return it to the user */
2143694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu    pC = (M4MCS_InternalContext *)M4OSA_32bitAlignedMalloc(sizeof(M4MCS_InternalContext),
21447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4MCS, (M4OSA_Char *)"M4MCS_InternalContext");
21457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pContext = pC;
21467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pC )
21487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
21497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
21507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_init(): unable to allocate M4MCS_InternalContext, returning M4ERR_ALLOC");
21517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_ALLOC;
21527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
21537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
21557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Init the context. All pointers must be initialized to M4OSA_NULL
21567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * because CleanUp() can be called just after Init(). */
21577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->State = M4MCS_kState_CREATED;
21587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pOsaFileReadPtr = pFileReadPtrFct;
21597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pOsaFileWritPtr = pFileWritePtrFct;
21607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->VideoState = M4MCS_kStreamState_NOSTREAM;
21617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AudioState = M4MCS_kStreamState_NOSTREAM;
21627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->noaudio = M4OSA_FALSE;
21637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->novideo = M4OSA_FALSE;
21647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiProgress = 0;
21657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
21677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Reader stuff */
21687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pInputFile = M4OSA_NULL;
21697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileType = M4VIDEOEDITING_kFileType_Unsupported;
21707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bFileOpenedInFastMode = M4OSA_FALSE;
21717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pReaderContext = M4OSA_NULL;
21727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pReaderVideoStream = M4OSA_NULL;
21737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pReaderAudioStream = M4OSA_NULL;
21747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bUnsupportedVideoFound = M4OSA_FALSE;
21757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bUnsupportedAudioFound = M4OSA_FALSE;
21767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->iAudioCtsOffset = 0;
21777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* First temporary video AU to have more precise end video cut*/
21787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ReaderVideoAU1.m_structSize = 0;
21797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Second temporary video AU to have more precise end video cut*/
21807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ReaderVideoAU2.m_structSize = 0;
21817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ReaderAudioAU1.m_structSize = 0;
21827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ReaderAudioAU2.m_structSize = 0;
21837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->m_audioAUDuration = 0;
21847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->m_pDataAddress1 = M4OSA_NULL;
21857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->m_pDataAddress2 = M4OSA_NULL;
21867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* First temporary video AU data to have more precise end video cut*/
21877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->m_pDataVideoAddress1 = M4OSA_NULL;
21887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Second temporary video AU data to have more precise end video cut*/
21897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->m_pDataVideoAddress2 = M4OSA_NULL;
21907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
21917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
21927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Video decoder stuff */
21937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pViDecCtxt = M4OSA_NULL;
21947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->dViDecStartingCts = 0.0;
21957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->iVideoBeginDecIncr = 0;
21967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->dViDecCurrentCts = 0.0;
21977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->dCtsIncrement = 0.0;
21987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->isRenderDup = M4OSA_FALSE;
21997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
22017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Video encoder stuff */
22027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pViEncCtxt = M4OSA_NULL;
22037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPreResizeFrame = M4OSA_NULL;
22047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiEncVideoBitrate = 0;
22057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->encoderState = M4MCS_kNoEncoder;
22067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
22087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Audio decoder stuff */
22097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pAudioDecCtxt = M4OSA_NULL;
22107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AudioDecBufferIn.m_dataAddress = M4OSA_NULL;
22117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AudioDecBufferIn.m_bufferSize = 0;
22127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AudioDecBufferOut.m_dataAddress = M4OSA_NULL;
22137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AudioDecBufferOut.m_bufferSize = 0;
22147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInDecBufferOut = M4OSA_NULL;
22157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
22167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Ssrc stuff */
22177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pSsrcBufferIn = M4OSA_NULL;
22187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pSsrcBufferOut = M4OSA_NULL;
22197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInSsrcBufferIn = M4OSA_NULL;
22207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInSsrcBufferOut = M4OSA_NULL;
22217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->iSsrcNbSamplIn = 0;
22227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->iSsrcNbSamplOut = 0;
22237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->SsrcScratch = M4OSA_NULL;
222452897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    pC->pLVAudioResampler = M4OSA_NULL;
22257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
22267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Audio encoder */
22277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pAudioEncCtxt = M4OSA_NULL;
22287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pAudioEncDSI.infoSize = 0;
22297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pAudioEncDSI.pInfo = M4OSA_NULL;
22307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pAudioEncoderBuffer = M4OSA_NULL;
22317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInAudioEncoderBuffer = M4OSA_NULL;
22327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->audioEncoderGranularity = 0;
22337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
22357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Writer stuff */
22367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pOutputFile = M4OSA_NULL;
22377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pTemporaryFile = M4OSA_NULL;
22387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pWriterContext = M4OSA_NULL;
22397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiVideoAUCount = 0;
22407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiVideoMaxAuSize = 0;
22417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiVideoMaxChunckSize = 0;
22427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiAudioAUCount = 0;
22437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiAudioMaxAuSize = 0;
22447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiAudioCts = 0;
22467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->b_isRawWriter = M4OSA_FALSE;
22477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pOutputPCMfile = M4OSA_NULL;
22487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Encoding config */
22507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->EncodingVideoFormat = M4ENCODER_kNULL; /**< No format set yet */
22517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->EncodingWidth = 0;                     /**< No size set yet */
22527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->EncodingHeight = 0;                    /**< No size set yet */
22537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->EncodingVideoFramerate = 0;            /**< No framerate set yet */
22547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiBeginCutTime = 0;                    /**< No begin cut */
22567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiEndCutTime = 0;                      /**< No end cut */
22577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiMaxFileSize = 0;                     /**< No limit */
22587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiAudioBitrate =
22597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VIDEOEDITING_kUndefinedBitrate; /**< No bitrate set yet */
22607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiVideoBitrate =
22617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VIDEOEDITING_kUndefinedBitrate; /**< No bitrate set yet */
22627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->WriterVideoStream.streamType = M4SYS_kVideoUnknown;
22647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->WriterVideoStreamInfo.Header.pBuf = M4OSA_NULL;
22657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->WriterAudioStream.streamType = M4SYS_kAudioUnknown;
22667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->outputVideoTimescale = 0;
22687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*FB 2008/10/20: add media rendering parameter and AIR context to keep media aspect ratio*/
22707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->MediaRendering = M4MCS_kResizing;
22717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->m_air_context = M4OSA_NULL;
22727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**/
22737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
22757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * FlB 2009.03.04: add audio Effects*/
22767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pEffects = M4OSA_NULL;
22777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->nbEffects = 0;
22787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pActiveEffectNumber = -1;
22797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**/
22807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*
22827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Reset pointers for media and codecs interfaces */
22837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_clearInterfaceTables(pC);
22847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ERR_CHECK_RETURN(err);
22857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*
22877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *  Call the media and codecs subscription module */
22887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_subscribeMediaAndCodec(pC);
22897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ERR_CHECK_RETURN(err);
22907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
22927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
22937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Initialize the Still picture part of MCS*/
22947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_stillPicInit(pC, pFileReadPtrFct, pFileWritePtrFct);
22967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ERR_CHECK_RETURN(err);
22977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
22987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->m_bIsStillPicture = M4OSA_FALSE;
22997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
23017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->m_pInstance = M4OSA_NULL;
23037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->H264MCSTempBuffer = M4OSA_NULL;
23047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->H264MCSTempBufferSize = 0;
23057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->H264MCSTempBufferDataSize = 0;
23067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bH264Trim = M4OSA_FALSE;
23077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Flag to get the last decoded frame cts */
23097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bLastDecodedFrameCTS = M4OSA_FALSE;
23107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_pInstance == M4OSA_NULL )
23127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
23137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = H264MCS_Getinstance(&pC->m_pInstance);
23147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
23157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bExtOMXAudDecoder = M4OSA_FALSE;
23167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
23187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
23197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_init(): returning M4NO_ERROR");
23207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
23217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
23227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
23247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
23257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_open(M4MCS_Context pContext, M4OSA_Void* pFileIn,
23267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                         M4OSA_Void* pFileOut, M4OSA_Void* pTempFile);
23277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Set the MCS input and output files.
23287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    It opens the input file, but the output file is not created yet.
23297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext            (IN) MCS context
23307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pFileIn             (IN) Input file to transcode (The type of this parameter
23317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                 (URL, pipe...) depends on the OSAL implementation).
23327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   mediaType           (IN) Container type (.3gp,.amr,mp3 ...) of input file.
23337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pFileOut            (IN) Output file to create  (The type of this parameter
23347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                    (URL, pipe...) depends on the OSAL implementation).
23357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pTempFile           (IN) Temporary file for the constant memory writer to
23367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                     store metadata ("moov.bin").
23377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR:         No error
23387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
23397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
23407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_ALLOC:        There is no more available memory
23417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_FILE_NOT_FOUND:   The input file has not been found
23427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_INVALID_INPUT_FILE:   The input file is not a valid file, or is corrupted
23437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_INPUT_FILE_CONTAINS_NO_SUPPORTED_STREAM:  The input file contains no
23447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                supported audio or video stream
23457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
23467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
23477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_open( M4MCS_Context pContext, M4OSA_Void *pFileIn,
23487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     M4VIDEOEDITING_FileType InputFileType, M4OSA_Void *pFileOut,
23497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     M4OSA_Void *pTempFile )
23507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
23517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext *)(pContext);
23527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
23537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4READER_MediaFamily mediaFamily;
23557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_StreamHandler *pStreamHandler;
23567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_3(
23587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_open called with pContext=0x%x, pFileIn=0x%x, pFileOut=0x%x",
23597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pContext, pFileIn, pFileOut);
23607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
23627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
23637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
23647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_open: pContext is M4OSA_NULL");
23657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pFileIn), M4ERR_PARAMETER,
23667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_open: pFileIn is M4OSA_NULL");
23677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( InputFileType == M4VIDEOEDITING_kFileType_JPG)
23697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || (InputFileType == M4VIDEOEDITING_kFileType_PNG)
23707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || (InputFileType == M4VIDEOEDITING_kFileType_GIF)
23717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || (InputFileType == M4VIDEOEDITING_kFileType_BMP) )
23727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
23737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
23747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
23757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Indicate that we must use the still picture functions*/
23767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->m_bIsStillPicture = M4OSA_TRUE;
23787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
23807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Call the still picture MCS functions*/
23817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_stillPicOpen(pC, pFileIn, InputFileType, pFileOut);
23827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else
23847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
23867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_open: Still picture is not supported with this version of MCS");
23877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_ERR_INPUT_FILE_CONTAINS_NO_SUPPORTED_STREAM;
23887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
23907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
23927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
23937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
23947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check state automaton */
23957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4MCS_kState_CREATED != pC->State )
23967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
23977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1("M4MCS_open(): Wrong State (%d), returning M4ERR_STATE",
23987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->State);
23997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_STATE;
24007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
24017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Copy function input parameters into our context */
24037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pInputFile = pFileIn;
24047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileType = InputFileType;
24057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pOutputFile = pFileOut;
24067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pTemporaryFile = pTempFile;
24077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiProgress = 0;
24087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /***********************************/
24107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Open input file with the reader */
24117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /***********************************/
24127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_setCurrentReader(pContext, pC->InputFileType);
24147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ERR_CHECK_RETURN(err);
24157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
24177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Reset reader related variables */
24187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->VideoState = M4MCS_kStreamState_NOSTREAM;
24197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AudioState = M4MCS_kStreamState_NOSTREAM;
24207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pReaderVideoStream = M4OSA_NULL;
24217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pReaderAudioStream = M4OSA_NULL;
24227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*******************************************************/
24247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Initializes the reader shell and open the data file */
24257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*******************************************************/
24267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->m_pReader->m_pFctCreate(&pC->pReaderContext);
24277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
24297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
24307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1("M4MCS_open(): m_pReader->m_pFctCreate returns 0x%x",
24317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
24327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
24337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
24347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
24367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Link the reader interface to the reader context */
24377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->m_pReaderDataIt->m_readerContext = pC->pReaderContext;
24387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
24407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Set the reader shell file access functions */
24417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->m_pReader->m_pFctSetOption(pC->pReaderContext,
24427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4READER_kOptionID_SetOsaFileReaderFctsPtr,
24437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_DataOption)pC->pOsaFileReadPtr);
24447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
24467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
24477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1("M4MCS_open(): m_pReader->m_pFctSetOption returns 0x%x",
24487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
24497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
24507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
24517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_WITH_FAST_OPEN
24537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_FALSE == pC->bFileOpenedInFastMode )
24557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
24567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Bool trueValue = M4OSA_TRUE;
24577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* For first call use fast open mode */
24597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReader->m_pFctSetOption(pC->pReaderContext,
24607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4READER_3GP_kOptionID_FastOpenMode, &trueValue);
24617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR == err )
24637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
24647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->bFileOpenedInFastMode = M4OSA_TRUE;
24657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
24667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
24677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
24687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
24697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_open(): M4READER_3GP_kOptionID_FastOpenMode returns 0x%x",
24707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
24717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( ( ( (M4OSA_UInt32)M4ERR_BAD_OPTION_ID) == err)
24737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                || (( (M4OSA_UInt32)M4ERR_PARAMETER) == err) )
24747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
24757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Not fatal, some readers may not support fast open mode */
24767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->bFileOpenedInFastMode = M4OSA_FALSE;
24777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
24787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
24797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
24807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
24817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
24827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
24837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
24847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Bool falseValue = M4OSA_FALSE;
24857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* For second call use normal open mode */
24877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReader->m_pFctSetOption(pC->pReaderContext,
24887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4READER_3GP_kOptionID_FastOpenMode, &falseValue);
24897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
24907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* M4MCS_WITH_FAST_OPEN */
24927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
24947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Open the input file */
24957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->m_pReader->m_pFctOpen(pC->pReaderContext, pC->pInputFile);
24977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
24987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
24997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
25007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 uiDummy, uiCoreId;
25017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1("M4MCS_open(): m_pReader->m_pFctOpen returns 0x%x", err);
25027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
25047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * If the error is from the core reader, we change it to a public VXS error */
25057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_ERR_SPLIT(err, uiDummy, uiCoreId, uiDummy);
25067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4MP4_READER == uiCoreId )
25087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
25097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
25107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_open(): returning M4MCS_ERR_INVALID_INPUT_FILE");
25117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4MCS_ERR_INVALID_INPUT_FILE;
25127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
25137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
25147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
25157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
25177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Get the streams from the input file */
25187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while( M4NO_ERROR == err )
25197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
25207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err =
25217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_pReader->m_pFctGetNextStream( pC->pReaderContext,
25227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                &mediaFamily,
25237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                &pStreamHandler);
25247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
25267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * In case we found a BIFS stream or something else...*/
25277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( err == ((M4OSA_UInt32)M4ERR_READER_UNKNOWN_STREAM_TYPE))
25287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            || (err == ((M4OSA_UInt32)M4WAR_TOO_MUCH_STREAMS)) )
25297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
25307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4NO_ERROR;
25317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            continue;
25327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
25337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR == err ) /**< One stream found */
25357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
25367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
25377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Found the first video stream */
25387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( ( M4READER_kMediaFamilyVideo == mediaFamily)
25397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                && (M4OSA_NULL == pC->pReaderVideoStream) )
25407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
25417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( ( M4DA_StreamTypeVideoH263 == pStreamHandler->m_streamType)
25427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    || (M4DA_StreamTypeVideoMpeg4
25437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    == pStreamHandler->m_streamType)
25447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    || (M4DA_StreamTypeVideoMpeg4Avc
25457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    == pStreamHandler->m_streamType) )
25467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
25477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE3_0(
25487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_open(): Found a H263 or MPEG-4 video stream in input 3gpp clip");
25497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
25517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Keep pointer to the video stream */
25527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pReaderVideoStream =
25537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4_VideoStreamHandler *)pStreamHandler;
25547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->bUnsupportedVideoFound = M4OSA_FALSE;
25557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pStreamHandler->m_bStreamIsOK = M4OSA_TRUE;
25567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
25587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Init our video stream state variable */
25597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->VideoState = M4MCS_kStreamState_STARTED;
25607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
25627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Reset the stream reader */
25637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = pC->m_pReader->m_pFctReset(pC->pReaderContext,
25647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4_StreamHandler *)pC->pReaderVideoStream);
25657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( M4NO_ERROR != err )
25677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
25687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1(
25697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4MCS_open():\
25707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            m_pReader->m_pFctReset(video) returns 0x%x",
25717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err);
25727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
25737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
25747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
25767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Initializes an access Unit */
25777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = pC->m_pReader->m_pFctFillAuStruct(pC->pReaderContext,
25787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pStreamHandler, &pC->ReaderVideoAU);
25797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( M4NO_ERROR != err )
25817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
25827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1(
25837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4MCS_open():\
25847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            m_pReader->m_pFctFillAuStruct(video) returns 0x%x",
25857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err);
25867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
25877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
25887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
25897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else /**< Not H263 or MPEG-4 (H264, etc.) */
25907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
25917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1("M4MCS_open(): Found an unsupported video stream (0x%x) in\
25927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                   input 3gpp clip",
25937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                   pStreamHandler->m_streamType);
25947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
25957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->bUnsupportedVideoFound = M4OSA_TRUE;
25967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pStreamHandler->m_bStreamIsOK = M4OSA_FALSE;
25977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
25987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* +CRLV6775 -H.264 Trimming */
25997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4DA_StreamTypeVideoMpeg4Avc
26007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    == pStreamHandler->m_streamType )
26017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
26027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    // SPS and PPS are storead as per the 3gp file format
26047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->m_pInstance->m_pDecoderSpecificInfo =
26057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pStreamHandler->m_pH264DecoderSpecificInfo;
26067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->m_pInstance->m_decoderSpecificInfoSize =
26077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pStreamHandler->m_H264decoderSpecificInfoSize;
26087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
26097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* -CRLV6775 -H.264 Trimming */
26107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
26117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
26127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Found the first audio stream */
26137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if( ( M4READER_kMediaFamilyAudio == mediaFamily)
26147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                && (M4OSA_NULL == pC->pReaderAudioStream) )
26157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
26167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( ( M4DA_StreamTypeAudioAmrNarrowBand
26177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    == pStreamHandler->m_streamType)
26187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    || (M4DA_StreamTypeAudioAac == pStreamHandler->m_streamType)
26197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    || (M4DA_StreamTypeAudioMp3
26207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    == pStreamHandler->m_streamType)
26217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    || (M4DA_StreamTypeAudioEvrc
26227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    == pStreamHandler->m_streamType) )
26237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
26247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE3_0(
26257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_open(): Found an AMR-NB, AAC or MP3 audio stream in input clip");
26267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
26287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Keep pointer to the audio stream */
26297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pReaderAudioStream =
26307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4_AudioStreamHandler *)pStreamHandler;
26317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pStreamHandler->m_bStreamIsOK = M4OSA_TRUE;
26327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->bUnsupportedAudioFound = M4OSA_FALSE;
26337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
26357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Init our audio stream state variable */
26367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioState = M4MCS_kStreamState_STARTED;
26377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
26397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Reset the stream reader */
26407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = pC->m_pReader->m_pFctReset(pC->pReaderContext,
26417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4_StreamHandler *)pC->pReaderAudioStream);
26427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( M4NO_ERROR != err )
26447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
26457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1(
26467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4MCS_open():\
26477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            m_pReader->m_pFctReset(audio) returns 0x%x",
26487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err);
26497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
26507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
26517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
26537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Initializes an access Unit */
26547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = pC->m_pReader->m_pFctFillAuStruct(pC->pReaderContext,
26557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pStreamHandler, &pC->ReaderAudioAU);
26567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( M4NO_ERROR != err )
26587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
26597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1(
26607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4MCS_open():\
26617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            m_pReader->m_pFctFillAuStruct(audio) returns 0x%x",
26627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err);
26637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
26647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
26657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
26677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Output max AU size is equal to input max AU size (this value
26687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * will be changed if there is audio transcoding) */
26697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->uiAudioMaxAuSize = pStreamHandler->m_maxAUSize;
26707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
26717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else
26727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
26737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**< Not AMR-NB, AAC, MP3 nor EVRC (AMR-WB, WAV...) */
26747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1("M4MCS_open(): Found an unsupported audio stream (0x%x) in \
26757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                   input 3gpp clip", pStreamHandler->m_streamType);
26767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->bUnsupportedAudioFound = M4OSA_TRUE;
26787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pStreamHandler->m_bStreamIsOK = M4OSA_FALSE;
26797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
26807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
26817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
26827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } /**< end of while (M4NO_ERROR == err) */
26837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
26857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check we found at least one supported stream */
26867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( M4OSA_NULL == pC->pReaderVideoStream)
26877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (M4OSA_NULL == pC->pReaderAudioStream) )
26887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
26897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
26907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_open(): returning M4MCS_ERR_INPUT_FILE_CONTAINS_NO_SUPPORTED_STREAM");
26917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_ERR_INPUT_FILE_CONTAINS_NO_SUPPORTED_STREAM;
26927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
26937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
26947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->VideoState == M4MCS_kStreamState_STARTED )
26957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
26967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4MCS_setCurrentVideoDecoder(pContext,
26977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderVideoStream->m_basicProperties.m_streamType);
26987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*FB 2009-02-09: the error is check and returned only if video codecs are compiled,
26997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else only audio is used, that is why the editing process can continue*/
27007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef M4MCS_AUDIOONLY
27017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ERR_CHECK_RETURN(err);
27037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else
27057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( M4NO_ERROR != err) && (M4MCS_WAR_MEDIATYPE_NOT_SUPPORTED != err) )
27077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
27087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4ERR_CHECK_RETURN(err);
27097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
27107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_AUDIOONLY*/
27127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
27147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->AudioState == M4MCS_kStreamState_STARTED )
27167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
27177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //EVRC
27187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4DA_StreamTypeAudioEvrc
27197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            != pStreamHandler->
27207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            m_streamType ) /* decoder not supported yet, but allow to do null encoding */
27217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
27227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4MCS_setCurrentAudioDecoder(pContext,
27237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pReaderAudioStream->m_basicProperties.m_streamType);
27247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4ERR_CHECK_RETURN(err);
27257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
27267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
27277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
27297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Get the audio and video stream properties */
27307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_intGetInputClipProperties(pC);
27317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
27337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
27347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
27357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_open(): M4MCS_intGetInputClipProperties returns 0x%x", err);
27367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
27377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
27387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
27407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Set the begin cut decoding increment according to the input frame rate */
27417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( 0. != pC->InputFileProperties.fAverageFrameRate ) /**< sanity check */
27427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
27437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->iVideoBeginDecIncr = (M4OSA_Int32)(3000.
27447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            / pC->InputFileProperties.
27457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            fAverageFrameRate); /**< about 3 frames */
27467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
27477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
27487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
27497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->iVideoBeginDecIncr =
27507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            200; /**< default value: 200 milliseconds (3 frames @ 15fps)*/
27517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
27527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
27547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Update state automaton */
27557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->State = M4MCS_kState_OPENED;
27567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
27587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
27597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_open(): returning M4NO_ERROR");
27607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
27617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
27627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
27647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
27657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_step(M4MCS_Context pContext, M4OSA_UInt8 *pProgress);
27667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Perform one step of trancoding.
27677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
27687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext            (IN) MCS context
27697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pProgress           (OUT) Progress percentage (0 to 100) of the transcoding
27707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    pProgress must be a valid address.
27717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR:         No error
27727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER:    One of the parameters is M4OSA_NULL (debug only)
27737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
27747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_WAR_TRANSCODING_DONE: Transcoding is over, user should now call M4MCS_close()
27757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_AUDIO_CONVERSION_FAILED: The audio conversion (AAC to AMR-NB or MP3) failed
27767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_INVALID_AAC_SAMPLING_FREQUENCY: The input file contains an AAC audio track
27777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                 with an invalid sampling frequency (should never happen)
27787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
27797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
27807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_step( M4MCS_Context pContext, M4OSA_UInt8 *pProgress )
27817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
27827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext *)(pContext);
27837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_1("M4MCS_step called with pContext=0x%x", pContext);
27857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
27877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
27887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
27897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_step: pContext is M4OSA_NULL");
27907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pProgress), M4ERR_PARAMETER,
27917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_step: pProgress is M4OSA_NULL");
27927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
27947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
27957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_bIsStillPicture )
27967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
27977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
27987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Call the still picture MCS functions*/
27997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_stillPicStep(pC, pProgress);
28007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
28017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
28037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
28057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check state automaton */
28067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pC->State )
28087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
28097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4MCS_kState_READY:
28107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pProgress = 0;
28117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4MCS_intStepSet(pC);
28127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
28137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4MCS_kState_BEGINVIDEOJUMP:
28157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pProgress = pC->uiProgress;
28167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4MCS_intStepBeginVideoJump(pC);
28177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
28187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4MCS_kState_BEGINVIDEODECODE:
28207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pProgress = pC->uiProgress;
28217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4MCS_intStepBeginVideoDecode(pC);
28227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
28237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4MCS_kState_PROCESSING:
28257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
28267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_ERR err = M4NO_ERROR;
28277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4MCS_intStepEncoding(pC, pProgress);
28287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Save progress info in case of pause */
28297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->uiProgress = *pProgress;
28307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
28317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
28327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
28337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default: /**< State error */
28357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
28367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_step(): Wrong State (%d), returning M4ERR_STATE",
28377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->State);
28387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_STATE;
28397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
28407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
28417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
28437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
28447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_pause(M4MCS_Context pContext);
28457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Pause the transcoding i.e. release the (external hardware) video decoder.
28467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    This function is not needed if no hardware accelerators are used.
28477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          In that case, pausing the MCS is simply achieved by temporarily suspending
28487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          the M4MCS_step function calls.
28497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext            (IN) MCS context
28507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR:         No error
28517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
28527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
28537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
28547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
28557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_pause( M4MCS_Context pContext )
28567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
28577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext *)(pContext);
28587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
28597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_1("M4MCS_pause called with pContext=0x%x", pContext);
28617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
28637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
28647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
28657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_pause: pContext is M4OSA_NULL");
28667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
28687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_bIsStillPicture )
28707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
28717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
28727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Call the corresponding still picture MCS function*/
28737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_stillPicPause(pC);
28747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
28757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
28777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
28797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check state automaton */
28807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pC->State )
28827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
28837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4MCS_kState_BEGINVIDEOJUMP: /**< the video decoder has been created,
28847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                            we must destroy it */
28857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4MCS_kState_BEGINVIDEODECODE: /**< the video is being used, we must destroy it */
28867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4MCS_kState_PROCESSING: /**< the video is being used, we must destroy it */
28877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**< OK, nothing to do here */
28887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
28897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default: /**< State error */
28917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
28927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_pause(): Wrong State (%d), returning M4ERR_STATE",
28937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->State);
28947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_STATE;
28957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
28967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
28977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
28987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Set the CTS at which we will resume the decoding */
28997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->dViDecCurrentCts > pC->dViDecStartingCts )
29007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
29017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
29027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * We passed the starting CTS, so the resume target is the current CTS */
29037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->dViDecStartingCts = pC->dViDecCurrentCts;
29047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
29057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else {
29067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
29077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * We haven't passed the starting CTS yet, so the resume target is still the starting CTS
29087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * --> nothing to do in the else block */
29097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
29107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
29127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Free video decoder stuff */
29137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pViDecCtxt )
29147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
29157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pVideoDecoder->m_pFctDestroy(pC->pViDecCtxt);
29167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pViDecCtxt = M4OSA_NULL;
29177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
29197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
29207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
29217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_pause: m_pVideoDecoder->pFctDestroy returns 0x%x", err);
29227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
29237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
29247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
29257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
29277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * State transition */
29287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->State = M4MCS_kState_PAUSED;
29297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_pause(): returning M4NO_ERROR");
29317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
29327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
29337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
29357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
29367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_resume(M4MCS_Context pContext);
29377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Resume the transcoding after a pause (see M4MCS_pause).
29387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    This function is not needed if no hardware accelerators are used.
29397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          In that case, resuming the MCS is simply achieved by calling
29407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          the M4MCS_step function.
29417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext            (IN) MCS context
29427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR:         No error
29437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
29447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
29457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
29467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
29477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_resume( M4MCS_Context pContext )
29487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
29497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext *)(pContext);
29507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
29517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_1("M4MCS_resume called with pContext=0x%x", pContext);
29537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
29557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
29567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
29577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_resume: pContext is M4OSA_NULL");
29587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
29607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_bIsStillPicture )
29627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
29637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
29647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Call the corresponding still picture MCS function*/
29657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_stillPicResume(pC);
29667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
29677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
29697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
29717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check state automaton */
29727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pC->State )
29747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
29757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4MCS_kState_PAUSED: /**< OK, nothing to do here */
29767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
29777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:                  /**< State error */
29797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
29807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_resume(): Wrong State (%d), returning M4ERR_STATE",
29817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->State);
29827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_STATE;
29837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
29847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
29857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
29877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Prepare the video decoder */
29887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_intPrepareVideoDecoder(pC);
29897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
29917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
29927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
29937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_resume(): M4MCS_intPrepareVideoDecoder() returns 0x%x", err);
29947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
29957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
29967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
29987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * State transition */
29997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( 0.0 == pC->dViDecStartingCts )
30007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
30017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
30027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * We are still at the beginning of the decoded stream, no need to jump, we can proceed */
30037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4MCS_kState_PROCESSING;
30047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
30057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
30067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
30077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
30087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Jumping */
30097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4MCS_kState_BEGINVIDEOJUMP;
30107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
30117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_resume(): returning M4NO_ERROR");
30137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
30147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
30157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
30177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
30187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_close(M4MCS_Context pContext);
30197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Finish the MCS transcoding.
30207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note The output 3GPP file is ready to be played after this call
30217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pContext            (IN) MCS context
30227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR:         No error
30237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4ERR_PARAMETER:    pContext is M4OSA_NULL (If Debug Level >= 2)
30247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
30257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
30267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
30277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_close( M4MCS_Context pContext )
30287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
30297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext *)(pContext);
30307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_Header *encHeader;
30317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_StreamIDmemAddr streamHeader;
30327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR, err2;
30347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_1("M4MCS_close called with pContext=0x%x", pContext);
30367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
30387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
30397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
30407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_close: pContext is M4OSA_NULL");
30417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
30437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_bIsStillPicture )
30457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
30467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
30477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Indicate that current file is no longer a still picture*/
30487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->m_bIsStillPicture = M4OSA_FALSE;
30497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
30517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Call the corresponding still picture MCS function*/
30527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_stillPicClose(pC);
30537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
30547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
30567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
30587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check state automaton */
30597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4MCS_kState_FINISHED != pC->State )
30617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
30627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1("M4MCS_close(): Wrong State (%d), returning M4ERR_STATE",
30637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->State);
30647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_STATE;
30657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
30667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Close the encoder before the writer to be certain all the AUs have been written and we can
30687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    get the DSI. */
30697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Has the encoder actually been started? Don't stop it if that's not the case. */
30717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4MCS_kEncoderRunning == pC->encoderState )
30727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
30737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->pVideoEncoderGlobalFcts->pFctStop != M4OSA_NULL )
30747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
30757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->pVideoEncoderGlobalFcts->pFctStop(pC->pViEncCtxt);
30767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
30787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
30797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
30807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_close: pVideoEncoderGlobalFcts->pFctStop returns 0x%x",
30817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
30827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Well... how the heck do you handle a failed cleanup? */
30837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
30847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
30857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->encoderState = M4MCS_kEncoderStopped;
30877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
30887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Has the encoder actually been opened? Don't close it if that's not the case. */
30907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4MCS_kEncoderStopped == pC->encoderState )
30917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
30927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pVideoEncoderGlobalFcts->pFctClose(pC->pViEncCtxt);
30937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
30947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
30957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
30967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
30977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_close: pVideoEncoderGlobalFcts->pFctClose returns 0x%x",
30987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
30997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Well... how the heck do you handle a failed cleanup? */
31007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
31017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->encoderState = M4MCS_kEncoderClosed;
31037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
31047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**********************************/
31067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /******** Close the writer ********/
31077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**********************************/
31087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pWriterContext ) /* happens in state _SET */
31097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
31107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* HW encoder: fetch the DSI from the shell video encoder, and feed it to the writer before
31117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        closing it. */
31127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->novideo != M4OSA_TRUE )
31147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
31157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( ( M4ENCODER_kMPEG4 == pC->EncodingVideoFormat)
31167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                || (M4ENCODER_kH264 == pC->EncodingVideoFormat) )
31177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
31187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = pC->pVideoEncoderGlobalFcts->pFctGetOption(pC->pViEncCtxt,
31197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4ENCODER_kOptionID_EncoderHeader,
31207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_DataOption) &encHeader);
31217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( ( M4NO_ERROR != err) || (M4OSA_NULL == encHeader->pBuf) )
31237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
31247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
31257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_close: failed to get the encoder header (err 0x%x)",
31267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
31277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**< no return here, we still have stuff to deallocate after close, even
31287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     if it fails. */
31297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
31307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else
31317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
31327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* set this header in the writer */
31337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    streamHeader.streamID = M4MCS_WRITER_VIDEO_STREAM_ID;
31347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    streamHeader.size = encHeader->Size;
31357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    streamHeader.addr = (M4OSA_MemAddr32)encHeader->pBuf;
31367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
31377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0("calling set option");
31397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = pC->pWriterGlobalFcts->pFctSetOption(pC->pWriterContext,
31407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4WRITER_kDSI, &streamHeader);
31417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0("set option done");
31427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4NO_ERROR != err )
31447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
31457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
31467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_close: failed to set the DSI in the writer (err 0x%x)",
31477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
31487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
31497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
31507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( ( M4OSA_TRUE == pC->bH264Trim)
31527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                && (M4ENCODER_kNULL == pC->EncodingVideoFormat) )
31537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
31547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if(pC->uiBeginCutTime == 0)
31557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
31567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1("Decoder specific info size = %d",
31577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->m_pInstance->m_decoderSpecificInfoSize);
31587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->m_pInstance->m_pFinalDSISize =
31597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->m_pInstance->m_decoderSpecificInfoSize;
31607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1("Decoder specific info pointer = %d",
31617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_MemAddr8)pC->m_pInstance->m_pDecoderSpecificInfo);
31627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->m_pInstance->m_pFinalDSI =
3164694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                        (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc(pC->m_pInstance-> \
31657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        m_decoderSpecificInfoSize, M4MCS,
31667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_Char *)"instance->m_pFinalDSI");
31677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->m_pInstance->m_pFinalDSI == M4OSA_NULL )
31697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
31707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_0("instance->m_pFinalDSI: allocation error");
31717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4ERR_ALLOC;
31727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
317332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    memcpy((void *)pC->m_pInstance->m_pFinalDSI,
317432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        (void *)pC-> \
31757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        m_pInstance->m_pDecoderSpecificInfo,
31767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->m_pInstance->m_decoderSpecificInfoSize);
31777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
31787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamHeader.streamID = M4MCS_WRITER_VIDEO_STREAM_ID;
31797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamHeader.size = pC->m_pInstance->m_pFinalDSISize;
31807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamHeader.addr =
31817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_MemAddr32)pC->m_pInstance->m_pFinalDSI;
31827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0("calling set option");
31837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = pC->pWriterGlobalFcts->pFctSetOption(pC->pWriterContext,
31847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4WRITER_kDSI, &streamHeader);
31857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0("set option done");
31867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4NO_ERROR != err )
31887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
31897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
31907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_close: failed to set the DSI in the writer (err 0x%x)",
31917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
31927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
31937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
31947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
31957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Write and close the 3GP output file */
31967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err2 = pC->pWriterGlobalFcts->pFctCloseWrite(pC->pWriterContext);
31977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pWriterContext = M4OSA_NULL;
31987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
31997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err2 )
32007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
32017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
32027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_close: pWriterGlobalFcts->pFctCloseWrite returns 0x%x",
32037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err2);
32047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR == err )
32067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = err2;
32077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< no return here, we still have stuff to deallocate after close, even if it fails.*/
32087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
32097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
32107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Close output PCM file if needed */
32127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->pOutputPCMfile != M4OSA_NULL )
32137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
32147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pOsaFileWritPtr->closeWrite(pC->pOutputPCMfile);
32157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pOutputPCMfile = M4OSA_NULL;
32167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
32177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*FlB 2009.03.04: add audio effects,
32197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    free effects list*/
32207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pEffects )
32217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
3222694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->pEffects);
32237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pEffects = M4OSA_NULL;
32247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
32257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->nbEffects = 0;
32267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pActiveEffectNumber = -1;
32277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
32297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * State transition */
32307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->State = M4MCS_kState_CLOSED;
32317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->H264MCSTempBuffer )
32337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
3234694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->H264MCSTempBuffer);
32357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
32367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_close(): returning M4NO_ERROR");
32387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
32397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
32407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
32427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
32437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_cleanUp(M4MCS_Context pContext);
32447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Free all resources used by the MCS.
32457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note The context is no more valid after this call
32467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pContext            (IN) MCS context
32477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR:         No error
32487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4ERR_PARAMETER:    pContext is M4OSA_NULL (If Debug Level >= 2)
32497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
32507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
32517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
32527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_cleanUp( M4MCS_Context pContext )
32537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
32547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
32557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext *)(pContext);
32567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_1("M4MCS_cleanUp called with pContext=0x%x", pContext);
32587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef MCS_DUMP_PCM_TO_FILE
32607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( file_au_reader )
32627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
32637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        fclose(file_au_reader);
32647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        file_au_reader = NULL;
32657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
32667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( file_pcm_decoder )
32687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
32697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        fclose(file_pcm_decoder);
32707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        file_pcm_decoder = NULL;
32717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
32727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( file_pcm_encoder )
32747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
32757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        fclose(file_pcm_encoder);
32767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        file_pcm_encoder = NULL;
32777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
32787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
32807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
32827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameter */
32837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pContext )
32857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
32867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
32877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_cleanUp: pContext is M4OSA_NULL, returning M4ERR_PARAMETER");
32887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_PARAMETER;
32897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
32907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
32917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
32927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check state automaton */
32937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4MCS_kState_CLOSED != pC->State )
32947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
32957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
32967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_cleanUp(): Wrong State (%d), returning M4ERR_STATE",
32977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->State);
32987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_STATE;
32997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
33007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3301b6c571382ade0561e95e63fef484f53971dc8c60Basavapatna Dattaguru    if( M4OSA_NULL != pC->m_pInstance )
3302b6c571382ade0561e95e63fef484f53971dc8c60Basavapatna Dattaguru    {
3303b6c571382ade0561e95e63fef484f53971dc8c60Basavapatna Dattaguru        err = H264MCS_Freeinstance(pC->m_pInstance);
3304b6c571382ade0561e95e63fef484f53971dc8c60Basavapatna Dattaguru        pC->m_pInstance = M4OSA_NULL;
3305b6c571382ade0561e95e63fef484f53971dc8c60Basavapatna Dattaguru    }
3306b6c571382ade0561e95e63fef484f53971dc8c60Basavapatna Dattaguru
33077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ----- Free video encoder stuff, if needed ----- */
33087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( M4OSA_NULL != pC->pViEncCtxt)
33107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (M4OSA_NULL != pC->pVideoEncoderGlobalFcts) )
33117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
33127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pVideoEncoderGlobalFcts->pFctCleanup(pC->pViEncCtxt);
33137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pViEncCtxt = M4OSA_NULL;
33147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
33167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
33177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
33187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_cleanUp: pVideoEncoderGlobalFcts->pFctCleanup returns 0x%x",
33197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
33207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< don't return, we still have stuff to free */
33217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
33227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->encoderState = M4MCS_kNoEncoder;
33247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
33257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
33277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * In the H263 case, we allocated our own DSI buffer */
33287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( M4ENCODER_kH263 == pC->EncodingVideoFormat)
33297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (M4OSA_NULL != pC->WriterVideoStreamInfo.Header.pBuf) )
33307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
3331694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->WriterVideoStreamInfo.Header.pBuf);
33327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStreamInfo.Header.pBuf = M4OSA_NULL;
33337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
33347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pPreResizeFrame )
33367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
33377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL != pC->pPreResizeFrame[0].pac_data )
33387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
3339694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            free(pC->pPreResizeFrame[0].pac_data);
33407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pPreResizeFrame[0].pac_data = M4OSA_NULL;
33417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
33427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL != pC->pPreResizeFrame[1].pac_data )
33447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
3345694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            free(pC->pPreResizeFrame[1].pac_data);
33467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pPreResizeFrame[1].pac_data = M4OSA_NULL;
33477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
33487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL != pC->pPreResizeFrame[2].pac_data )
33507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
3351694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            free(pC->pPreResizeFrame[2].pac_data);
33527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pPreResizeFrame[2].pac_data = M4OSA_NULL;
33537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
3354694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->pPreResizeFrame);
33557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame = M4OSA_NULL;
33567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
33577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ----- Free the ssrc stuff ----- */
33597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->SsrcScratch )
33617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
3362694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->SsrcScratch);
33637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->SsrcScratch = M4OSA_NULL;
33647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
33657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pSsrcBufferIn )
33677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
3368694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->pSsrcBufferIn);
33697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pSsrcBufferIn = M4OSA_NULL;
33707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
33717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pSsrcBufferOut )
33737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
3374694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->pSsrcBufferOut);
33757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pSsrcBufferOut = M4OSA_NULL;
33767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
33777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
337852897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    if (pC->pLVAudioResampler != M4OSA_NULL)
337952897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    {
3380100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru        LVDestroy(pC->pLVAudioResampler);
338152897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi        pC->pLVAudioResampler = M4OSA_NULL;
338252897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    }
338352897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi
33847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ----- Free the audio encoder stuff ----- */
33857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pAudioEncCtxt )
33877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
33887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pAudioEncoderGlobalFcts->pFctClose(pC->pAudioEncCtxt);
33897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
33917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
33927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
33937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_cleanUp: pAudioEncoderGlobalFcts->pFctClose returns 0x%x",
33947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
33957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< don't return, we still have stuff to free */
33967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
33977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
33987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pAudioEncoderGlobalFcts->pFctCleanUp(pC->pAudioEncCtxt);
33997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
34017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
34027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
34037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_cleanUp: pAudioEncoderGlobalFcts->pFctCleanUp returns 0x%x",
34047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
34057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< don't return, we still have stuff to free */
34067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
34077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pAudioEncCtxt = M4OSA_NULL;
34097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
34107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pAudioEncoderBuffer )
34127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
3413694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->pAudioEncoderBuffer);
34147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pAudioEncoderBuffer = M4OSA_NULL;
34157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
34167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ----- Free all other stuff ----- */
34187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
34207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Free the readers and the decoders */
34217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_intCleanUp_ReadersDecoders(pC);
34227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
34247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
34257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Free the still picture resources */
34267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_stillPicCleanUp(pC);
34287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
34307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
34327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Free the shells interfaces */
34337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_unRegisterAllWriters(pContext);
34357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_unRegisterAllEncoders(pContext);
34367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_unRegisterAllReaders(pContext);
34377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_unRegisterAllDecoders(pContext);
34387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
34407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Free the context itself */
3441694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu    free(pC);
34427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC = M4OSA_NULL;
34437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_cleanUp(): returning M4NO_ERROR");
34457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
34467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
34477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
34497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
34507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_abort(M4MCS_Context pContext);
34517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Finish the MCS transcoding and free all resources used by the MCS
34527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          whatever the state is.
34537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    The context is no more valid after this call
34547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pContext            (IN) MCS context
34557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4NO_ERROR:            No error
34567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return    M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
34577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
34587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
34597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_abort( M4MCS_Context pContext )
34607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
34617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
34627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err1 = M4NO_ERROR;
34637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext *)(pContext);
34647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pContext )
34667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
34677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
34687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
34697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->State == M4MCS_kState_CREATED)
34717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || (pC->State == M4MCS_kState_CLOSED) )
34727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
34737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4MCS_kState_CLOSED;
34747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4MCS_cleanUp(pContext);
34767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( err != M4NO_ERROR )
34787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
34797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1("M4MCS_abort : M4MCS_cleanUp fails err = 0x%x", err);
34807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
34817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
34827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
34837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
34847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
34857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->m_bIsStillPicture )
34877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
34887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
34897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Cancel the ongoing processes if any*/
34907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4MCS_stillPicCancel(pC);
34917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
34927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( err != M4NO_ERROR )
34937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
34947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
34957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_abort : M4MCS_stillPicCancel fails err = 0x%x", err);
34967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
34977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*Still picture process is now stopped; Carry on with close and cleanup*/
34987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
34997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
35017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4MCS_kState_FINISHED;
35037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4MCS_close(pContext);
35057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( err != M4NO_ERROR )
35077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
35087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1("M4MCS_abort : M4MCS_close fails err = 0x%x", err);
35097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err1 = err;
35107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
35117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4MCS_cleanUp(pContext);
35137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( err != M4NO_ERROR )
35157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
35167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1("M4MCS_abort : M4MCS_cleanUp fails err = 0x%x", err);
35177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
35187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
35197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = (err1 == M4NO_ERROR) ? err : err1;
35207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
35217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
35227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
35247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
35257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_getInputFileProperties(M4MCS_Context pContext,
35267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                         M4VIDEOEDITING_ClipProperties* pFileProperties);
35277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Retrieves the properties of the audio and video streams from the input file.
35287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext            (IN) MCS context
35297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pProperties         (OUT) Pointer on an allocated M4VIDEOEDITING_ClipProperties
35307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistructure which is filled with the input stream properties.
35317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    The structure pProperties must be allocated and further de-allocated
35327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiby the application. The function must be called in the opened state.
35337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR:         No error
35347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
35357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
35367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
35377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
35387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_getInputFileProperties( M4MCS_Context pContext,
35397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                       M4VIDEOEDITING_ClipProperties *pFileProperties )
35407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
35417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext *)(pContext);
35427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_2("M4MCS_getInputFileProperties called with pContext=0x%x, \
35447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                   pFileProperties=0x%x", pContext, pFileProperties);
35457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
35477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
35487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
35497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_getInputFileProperties: pContext is M4OSA_NULL");
35507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pFileProperties), M4ERR_PARAMETER,
35517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_getInputFileProperties: pProperties is M4OSA_NULL");
35527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
35547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_bIsStillPicture )
35567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
35577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
35587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Call the corresponding still picture MCS function*/
35597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_stillPicGetInputFileProperties(pC, pFileProperties);
35607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
35617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
35637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
35657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check state automaton */
35667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4MCS_kState_OPENED != pC->State )
35687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
35697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
35707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_getInputFileProperties(): Wrong State (%d), returning M4ERR_STATE",
35717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->State);
35727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_STATE;
35737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
35747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
35767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Copy previously computed properties into given structure */
357732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu    memcpy((void *)pFileProperties,
357832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        (void *) &pC->InputFileProperties,
35797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        sizeof(M4VIDEOEDITING_ClipProperties));
35807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
35827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
35837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
35847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
35857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
35867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_setOutputParams(M4MCS_Context pContext, M4MCS_OutputParams* pParams);
35877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Set the MCS video output parameters.
35887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    Must be called after M4MCS_open. Must be called before M4MCS_step.
35897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext            (IN) MCS context
35907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pParams             (IN/OUT) Transcoding parameters
35917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR:         No error
35927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
35937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
35947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_INVALID_VIDEO_FRAME_SIZE_FOR_H263 : Output video frame size parameter is
35957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                                        incompatible with H263 encoding
35967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_INVALID_VIDEO_FRAME_RATE_FOR_H263 : Output video frame size parameter is
35977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                                        incompatible with H263 encoding
35987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FORMAT     : Undefined output video format parameter
35997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FRAME_SIZE : Undefined output video frame size
36007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FRAME_RATE : Undefined output video frame rate
36017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_UNDEFINED_OUTPUT_AUDIO_FORMAT : Undefined output audio format parameter
36027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_DURATION_IS_NULL : Specified output parameters define a null duration stream
36037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                         (no audio and video)
36047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
36057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
36067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_setOutputParams( M4MCS_Context pContext,
36077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4MCS_OutputParams *pParams )
36087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
36097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext *)(pContext);
36107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 uiFrameWidth;
36117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 uiFrameHeight;
36127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
36137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_2(
36157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_setOutputParams called with pContext=0x%x, pParams=0x%x",
36167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pContext, pParams);
36177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
36197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
36207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
36217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_setOutputParams: pContext is M4OSA_NULL");
36227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pParams), M4ERR_PARAMETER,
36237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_setOutputParams: pParam is M4OSA_NULL");
36247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
36267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_bIsStillPicture )
36287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
36297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
36307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Call the corresponding still picture MCS function*/
36317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_stillPicSetOutputParams(pC, pParams);
36327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
36337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
36357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
36377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check state automaton */
36387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4MCS_kState_OPENED != pC->State )
36407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
36417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
36427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_setOutputParams(): Wrong State (%d), returning M4ERR_STATE",
36437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->State);
36447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_STATE;
36457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
36467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Ignore audio or video stream if the output do not need it, */
36487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* or if the input file does not have any audio or video stream */
36497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*FlB 26.02.2009: add mp3 as mcs output format*/
36507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pParams->OutputVideoFormat == M4VIDEOEDITING_kNoneVideo)
36517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || (pC->VideoState == M4MCS_kStreamState_NOSTREAM)
36527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || (pParams->OutputFileType == M4VIDEOEDITING_kFileType_AMR)
36537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || (pParams->OutputFileType == M4VIDEOEDITING_kFileType_MP3) )
36547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
36557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->novideo = M4OSA_TRUE;
36567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
36577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pParams->OutputAudioFormat == M4VIDEOEDITING_kNoneAudio)
36597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || (pC->AudioState == M4MCS_kStreamState_NOSTREAM) )
36607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
36617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->noaudio = M4OSA_TRUE;
36627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
36637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->noaudio && pC->novideo )
36657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
36667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
36677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "!!! M4MCS_setOutputParams : clip is NULL, there is no audio, no video");
36687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_ERR_DURATION_IS_NULL;
36697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
36707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Set writer */
36727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_setCurrentWriter(pContext, pParams->OutputFileType);
36737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ERR_CHECK_RETURN(err);
36747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Set video parameters */
36767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->novideo == M4OSA_FALSE )
36777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
36787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
36797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Check Video Format correctness */
36807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pParams->OutputVideoFormat )
36827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
36837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4VIDEOEDITING_kH263:
36847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pParams->OutputFileType == M4VIDEOEDITING_kFileType_MP4 )
36857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4MCS_ERR_H263_FORBIDDEN_IN_MP4_FILE;
36867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->EncodingVideoFormat = M4ENCODER_kH263;
36887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4MCS_setCurrentVideoEncoder(pContext,
36897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pParams->OutputVideoFormat);
36907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4ERR_CHECK_RETURN(err);
36917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
36927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4VIDEOEDITING_kMPEG4:
36947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
36957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->EncodingVideoFormat = M4ENCODER_kMPEG4;
36967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4MCS_setCurrentVideoEncoder(pContext,
36977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pParams->OutputVideoFormat);
36987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4ERR_CHECK_RETURN(err);
36997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
37007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4VIDEOEDITING_kH264:
37027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->EncodingVideoFormat = M4ENCODER_kH264;
37047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4MCS_setCurrentVideoEncoder(pContext,
37057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pParams->OutputVideoFormat);
37067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4ERR_CHECK_RETURN(err);
37077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
37087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4VIDEOEDITING_kNullVideo:
37107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( ( pParams->OutputFileType == M4VIDEOEDITING_kFileType_MP4)
37117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    && (pC->InputFileProperties.VideoStreamType
37127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    == M4VIDEOEDITING_kH263) )
37137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4MCS_ERR_H263_FORBIDDEN_IN_MP4_FILE;
37147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Encoder needed for begin cut to generate an I-frame */
37177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->EncodingVideoFormat = M4ENCODER_kNULL;
37187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4MCS_setCurrentVideoEncoder(pContext,
37197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->InputFileProperties.VideoStreamType);
37207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4ERR_CHECK_RETURN(err);
37217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
37227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            default:
37247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1("M4MCS_setOutputParams: Undefined output video format (%d),\
37257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                               returning M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FORMAT",
37267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                               pParams->OutputVideoFormat);
37277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FORMAT;
37287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
37297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
37317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Check Video frame size correctness */
37327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4VIDEOEDITING_kNullVideo == pParams->OutputVideoFormat )
37337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
37347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            uiFrameWidth =
37357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->EncodingWidth = pC->InputFileProperties.uiVideoWidth;
37367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            uiFrameHeight =
37377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->EncodingHeight = pC->InputFileProperties.uiVideoHeight;
373816ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury
37390a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            /**
37400a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            * Set output video profile and level */
37410a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            pC->encodingVideoProfile = pC->InputFileProperties.uiVideoProfile;
374272425b1109ddd092048b5280889f972626a61b7eHong Teng            /** Set the target video level, because input 3gp file may
374372425b1109ddd092048b5280889f972626a61b7eHong Teng             *  have wrong video level value (some encoders do not respect
374472425b1109ddd092048b5280889f972626a61b7eHong Teng             *  level restrictions like video resolution when content is created).
374572425b1109ddd092048b5280889f972626a61b7eHong Teng             **/
374672425b1109ddd092048b5280889f972626a61b7eHong Teng            pC->encodingVideoLevel = pParams->outputVideoLevel;
374716ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury
374816ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury            // Clip's original width and height may not be
374916ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury            // multiple of 16.
375016ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury            // Ensure encoding width and height are multiple of 16
375116ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury
375216ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury            uint32_t remainder = pC->EncodingWidth % 16;
375316ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury            if (remainder != 0) {
375416ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                if (remainder >= 8) {
375516ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                    // Roll forward
375616ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                    pC->EncodingWidth =
375716ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                        pC->EncodingWidth + (16-remainder);
375816ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                } else {
375916ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                    // Roll backward
376016ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                    pC->EncodingWidth =
376116ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                        pC->EncodingWidth - remainder;
376216ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                }
376316ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                uiFrameWidth = pC->EncodingWidth;
376416ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury            }
376516ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury
376616ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury            remainder = pC->EncodingHeight % 16;
376716ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury            if (remainder != 0) {
376816ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                if (remainder >= 8) {
376916ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                    // Roll forward
377016ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                    pC->EncodingHeight =
377116ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                        pC->EncodingHeight + (16-remainder);
377216ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                } else {
377316ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                    // Roll backward
377416ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                    pC->EncodingHeight =
377516ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                        pC->EncodingHeight - remainder;
377616ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                }
377716ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury                uiFrameHeight = pC->EncodingHeight;
377816ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury            }
377916ecf765405a22118e9d3bd2d3c22df374794dcfRajneesh Chowdury
37807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
37817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
37827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
37830a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            /**
37840a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            * Set output video profile and level */
37850a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            pC->encodingVideoProfile = pParams->outputVideoProfile;
37860a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            pC->encodingVideoLevel = pParams->outputVideoLevel;
37870a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury
37887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            switch( pParams->OutputVideoFrameSize )
37897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
37907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kSQCIF:
37917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameWidth = pC->EncodingWidth = M4ENCODER_SQCIF_Width;
37927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameHeight = pC->EncodingHeight = M4ENCODER_SQCIF_Height;
37937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
37947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
37957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kQQVGA:
37967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameWidth = pC->EncodingWidth = M4ENCODER_QQVGA_Width;
37977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameHeight = pC->EncodingHeight = M4ENCODER_QQVGA_Height;
37987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
37997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kQCIF:
38017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameWidth = pC->EncodingWidth = M4ENCODER_QCIF_Width;
38027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameHeight = pC->EncodingHeight = M4ENCODER_QCIF_Height;
38037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
38047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kQVGA:
38067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameWidth = pC->EncodingWidth = M4ENCODER_QVGA_Width;
38077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameHeight = pC->EncodingHeight = M4ENCODER_QVGA_Height;
38087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
38097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kCIF:
38117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameWidth = pC->EncodingWidth = M4ENCODER_CIF_Width;
38127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameHeight = pC->EncodingHeight = M4ENCODER_CIF_Height;
38137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
38147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kVGA:
38167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameWidth = pC->EncodingWidth = M4ENCODER_VGA_Width;
38177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameHeight = pC->EncodingHeight = M4ENCODER_VGA_Height;
38187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
38197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* +PR LV5807 */
38207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kWVGA:
38217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameWidth = pC->EncodingWidth = M4ENCODER_WVGA_Width;
38227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameHeight = pC->EncodingHeight = M4ENCODER_WVGA_Height;
38237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
38247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kNTSC:
38267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameWidth = pC->EncodingWidth = M4ENCODER_NTSC_Width;
38277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameHeight = pC->EncodingHeight = M4ENCODER_NTSC_Height;
38287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
38297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* -PR LV5807*/
38307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* +CR Google */
38317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_k640_360:
38327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameWidth = pC->EncodingWidth = M4ENCODER_640_360_Width;
38337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameHeight =
38347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->EncodingHeight = M4ENCODER_640_360_Height;
38357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
38367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_k854_480:
38388806b706693c0992724f6603353af18aeb4a0f80Hong Teng                    uiFrameWidth =
38398806b706693c0992724f6603353af18aeb4a0f80Hong Teng                        pC->EncodingWidth = M4ENCODER_854_480_Width;
38407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameHeight =
38417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->EncodingHeight = M4ENCODER_854_480_Height;
38427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
38437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38448806b706693c0992724f6603353af18aeb4a0f80Hong Teng                case M4VIDEOEDITING_k1280_720:
38458806b706693c0992724f6603353af18aeb4a0f80Hong Teng                    uiFrameWidth =
38468806b706693c0992724f6603353af18aeb4a0f80Hong Teng                        pC->EncodingWidth = M4ENCODER_1280_720_Width;
38477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameHeight =
38488806b706693c0992724f6603353af18aeb4a0f80Hong Teng                        pC->EncodingHeight = M4ENCODER_1280_720_Height;
38497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
38507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38518806b706693c0992724f6603353af18aeb4a0f80Hong Teng                case M4VIDEOEDITING_k1080_720:
38528806b706693c0992724f6603353af18aeb4a0f80Hong Teng                    uiFrameWidth =
38538806b706693c0992724f6603353af18aeb4a0f80Hong Teng                        pC->EncodingWidth = M4ENCODER_1080_720_Width;
38547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiFrameHeight =
38558806b706693c0992724f6603353af18aeb4a0f80Hong Teng                        pC->EncodingHeight = M4ENCODER_1080_720_Height;
38567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
38577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38588806b706693c0992724f6603353af18aeb4a0f80Hong Teng                case M4VIDEOEDITING_k960_720:
38598806b706693c0992724f6603353af18aeb4a0f80Hong Teng                    uiFrameWidth =
38608806b706693c0992724f6603353af18aeb4a0f80Hong Teng                        pC->EncodingWidth = M4ENCODER_960_720_Width;
38618806b706693c0992724f6603353af18aeb4a0f80Hong Teng                    uiFrameHeight =
38628806b706693c0992724f6603353af18aeb4a0f80Hong Teng                        pC->EncodingHeight = M4ENCODER_960_720_Height;
38638806b706693c0992724f6603353af18aeb4a0f80Hong Teng                    break;
38648806b706693c0992724f6603353af18aeb4a0f80Hong Teng
38658806b706693c0992724f6603353af18aeb4a0f80Hong Teng                case M4VIDEOEDITING_k1920_1080:
38668806b706693c0992724f6603353af18aeb4a0f80Hong Teng                    uiFrameWidth =
38678806b706693c0992724f6603353af18aeb4a0f80Hong Teng                        pC->EncodingWidth = M4ENCODER_1920_1080_Width;
38688806b706693c0992724f6603353af18aeb4a0f80Hong Teng                    uiFrameHeight =
38698806b706693c0992724f6603353af18aeb4a0f80Hong Teng                        pC->EncodingHeight = M4ENCODER_1920_1080_Height;
38707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
38717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* -CR Google */
38727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                default:
38737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
38747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_setOutputParams: Undefined output video frame size \
38757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (%d), returning M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FRAME_SIZE",
38767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pParams->OutputVideoFrameSize);
38777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FRAME_SIZE;
38787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
38797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
38807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
38827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Compute video max au size and max chunck size.
38837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * We do it here because it depends on the frame size only, and
38847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * because we need it for the file size/video bitrate estimations */
38857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->uiVideoMaxAuSize =
38867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt32)(1.5F *(M4OSA_Float)(uiFrameWidth * uiFrameHeight) \
38877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *M4MCS_VIDEO_MIN_COMPRESSION_RATIO);
38887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->uiVideoMaxChunckSize = (M4OSA_UInt32)(pC->uiVideoMaxAuSize       \
38897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *
38907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS_VIDEO_CHUNK_AU_SIZE_RATIO); /**< from max AU size to max Chunck size */
38917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
38927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( 0 == pC->uiVideoMaxAuSize )
38937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
38947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Size may be zero in case of null encoding with unrecognized stream */
38957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("M4MCS_setOutputParams: video frame size is 0 returning\
38967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                           M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FRAME_SIZE");
38977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FRAME_SIZE;
38987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
38997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
39027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Size check for H263 (only valid sizes are CIF, QCIF and SQCIF) */
39037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4VIDEOEDITING_kH263 == pParams->OutputVideoFormat )
39057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
39067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            switch( pParams->OutputVideoFrameSize )
39077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
39087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kSQCIF:
39097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kQCIF:
39107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kCIF:
39117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* OK */
39127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
39137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                default:
39157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_0(
39167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_setOutputParams():\
39177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        returning M4MCS_ERR_INVALID_VIDEO_FRAME_SIZE_FOR_H263");
39187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4MCS_ERR_INVALID_VIDEO_FRAME_SIZE_FOR_H263;
39197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
39207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
39217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
39237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Check Video Frame rate correctness */
39247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4VIDEOEDITING_kNullVideo != pParams->OutputVideoFormat )
39257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
39267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            switch( pParams->OutputVideoFrameRate )
39277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
39287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_k5_FPS:
39297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->EncodingVideoFramerate = M4ENCODER_k5_FPS;
39307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
39317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_k7_5_FPS:
39337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->EncodingVideoFramerate = M4ENCODER_k7_5_FPS;
39347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
39357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_k10_FPS:
39377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->EncodingVideoFramerate = M4ENCODER_k10_FPS;
39387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
39397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_k12_5_FPS:
39417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->EncodingVideoFramerate = M4ENCODER_k12_5_FPS;
39427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
39437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_k15_FPS:
39457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->EncodingVideoFramerate = M4ENCODER_k15_FPS;
39467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
39477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_k20_FPS:
39497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->EncodingVideoFramerate = M4ENCODER_k20_FPS;
39507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
39517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_k25_FPS:
39537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->EncodingVideoFramerate = M4ENCODER_k25_FPS;
39547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
39557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_k30_FPS:
39577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->EncodingVideoFramerate = M4ENCODER_k30_FPS;
39587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
39597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                default:
39617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
39627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_setOutputParams: Undefined output video frame rate\
39637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (%d), returning M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FRAME_RATE",
39647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pParams->OutputVideoFrameRate);
39657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FRAME_RATE;
39667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
39677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
39687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
39707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Frame rate check for H263 (only dividers of 30 fps (29.97 actually)) */
39717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4VIDEOEDITING_kH263 == pParams->OutputVideoFormat )
39727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
39737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            switch( pC->EncodingVideoFramerate )
39747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
39757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4ENCODER_k5_FPS:
39767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4ENCODER_k7_5_FPS:
39777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4ENCODER_k10_FPS:
39787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4ENCODER_k15_FPS:
39797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4ENCODER_k30_FPS:
39807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* OK */
39817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
39827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                default:
39847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_0(
39857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_setOutputParams():\
39867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        returning M4MCS_ERR_INVALID_VIDEO_FRAME_RATE_FOR_H263");
39877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4MCS_ERR_INVALID_VIDEO_FRAME_RATE_FOR_H263;
39887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
39897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
39907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
39917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
39927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Set audio parameters */
39937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->noaudio == M4OSA_FALSE )
39947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
39957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
39967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Check Audio Format correctness */
39977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pParams->OutputAudioFormat )
39987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
39997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4VIDEOEDITING_kAMR_NB:
40007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4MCS_setCurrentAudioEncoder(pContext,
40027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pParams->OutputAudioFormat);
40037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4ERR_CHECK_RETURN(err);
40047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->AudioEncParams.Format = M4ENCODER_kAMRNB;
40067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->AudioEncParams.Frequency = M4ENCODER_k8000Hz;
40077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->AudioEncParams.ChannelNum = M4ENCODER_kMono;
40087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->AudioEncParams.SpecifParam.AmrSID = M4ENCODER_kAmrNoSID;
40097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
40107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4VIDEOEDITING_kAAC:
40127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4MCS_setCurrentAudioEncoder(pContext,
40147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pParams->OutputAudioFormat);
40157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4ERR_CHECK_RETURN(err);
40167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->AudioEncParams.Format = M4ENCODER_kAAC;
40187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->AudioEncParams.Frequency = M4ENCODER_k16000Hz;
40197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                switch( pParams->OutputAudioSamplingFrequency )
40217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
40227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_k8000_ASF:
40237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.Frequency = M4ENCODER_k8000Hz;
40247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
40257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_k16000_ASF:
40277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.Frequency = M4ENCODER_k16000Hz;
40287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
40297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_k22050_ASF:
40317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.Frequency = M4ENCODER_k22050Hz;
40327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
40337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_k24000_ASF:
40357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.Frequency = M4ENCODER_k24000Hz;
40367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
40377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_k32000_ASF:
40397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.Frequency = M4ENCODER_k32000Hz;
40407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
40417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_k44100_ASF:
40437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.Frequency = M4ENCODER_k44100Hz;
40447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
40457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_k48000_ASF:
40477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.Frequency = M4ENCODER_k48000Hz;
40487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
40497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_k11025_ASF:
40517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_k12000_ASF:
40527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_kDefault_ASF:
40537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
40547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
40557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioEncParams.ChannelNum =
40567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (pParams->bAudioMono == M4OSA_TRUE) ? \
40577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4ENCODER_kMono : M4ENCODER_kStereo;
40587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioEncParams.SpecifParam.AacParam.Regulation =
40597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4ENCODER_kAacRegulNone; //M4ENCODER_kAacBitReservoir
40607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* unused */
40617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioEncParams.SpecifParam.AacParam.bIS = M4OSA_FALSE;
40627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioEncParams.SpecifParam.AacParam.bMS = M4OSA_FALSE;
40637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioEncParams.SpecifParam.AacParam.bPNS = M4OSA_FALSE;
40647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioEncParams.SpecifParam.AacParam.bTNS = M4OSA_FALSE;
40657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* TODO change into highspeed asap */
40667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioEncParams.SpecifParam.AacParam.bHighSpeed =
40677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_FALSE;
40687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
40697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /*FlB 26.02.2009: add mp3 as mcs output format, add mp3 encoder*/
40717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kMP3:
40727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = M4MCS_setCurrentAudioEncoder(pContext,
40737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pParams->OutputAudioFormat);
40747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4ERR_CHECK_RETURN(err);
40757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioEncParams.Format = M4ENCODER_kMP3;
40777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioEncParams.ChannelNum =
40787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (pParams->bAudioMono == M4OSA_TRUE) ? \
40797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4ENCODER_kMono : M4ENCODER_kStereo;
40807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioEncParams.Frequency = M4ENCODER_k16000Hz;
40827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    switch( pParams->OutputAudioSamplingFrequency )
40847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
40857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        case M4VIDEOEDITING_k8000_ASF:
40867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.Frequency = M4ENCODER_k8000Hz;
40877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
40887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        case M4VIDEOEDITING_k11025_ASF:
40907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.Frequency = M4ENCODER_k11025Hz;
40917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
40927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        case M4VIDEOEDITING_k12000_ASF:
40947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.Frequency = M4ENCODER_k12000Hz;
40957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
40967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
40977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        case M4VIDEOEDITING_k16000_ASF:
40987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.Frequency = M4ENCODER_k16000Hz;
40997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
41007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        case M4VIDEOEDITING_k22050_ASF:
41027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.Frequency = M4ENCODER_k22050Hz;
41037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
41047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        case M4VIDEOEDITING_k24000_ASF:
41067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.Frequency = M4ENCODER_k24000Hz;
41077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
41087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        case M4VIDEOEDITING_k32000_ASF:
41107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.Frequency = M4ENCODER_k32000Hz;
41117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
41127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        case M4VIDEOEDITING_k44100_ASF:
41147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.Frequency = M4ENCODER_k44100Hz;
41157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
41167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        case M4VIDEOEDITING_k48000_ASF:
41187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.Frequency = M4ENCODER_k48000Hz;
41197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
41207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        case M4VIDEOEDITING_kDefault_ASF:
41227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
41237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
41247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
41267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kNullAudio:
41287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pParams->pEffects == M4OSA_NULL || pParams->nbEffects == 0 )
41297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
41307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        /* no encoder needed */
41317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.Format = M4ENCODER_kAudioNULL;
41327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.Frequency =
41337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->pReaderAudioStream->m_samplingFrequency;
41347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.ChannelNum =
41357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (pC->pReaderAudioStream->m_nbChannels == 1) ? \
41367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4ENCODER_kMono : M4ENCODER_kStereo;
41377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
41387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else
41397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
41407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.Frequency =
41417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->pReaderAudioStream->m_samplingFrequency;
41427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.ChannelNum =
41437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            (pC->pReaderAudioStream->m_nbChannels == 1) ? \
41447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4ENCODER_kMono : M4ENCODER_kStereo;
41457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        switch( pC->InputFileProperties.AudioStreamType )
41477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
41487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            case M4VIDEOEDITING_kAMR_NB:
41497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_TRACE3_0(
41507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    "M4MCS_setOutputParams calling \
41517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4MCS_setCurrentAudioEncoder M4VIDEOEDITING_kNull, AMR");
41527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                err = M4MCS_setCurrentAudioEncoder(pContext,
41537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->InputFileProperties.AudioStreamType);
41547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4ERR_CHECK_RETURN(err);
41557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->AudioEncParams.Format = M4ENCODER_kAMRNB;
41577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->AudioEncParams.Frequency = M4ENCODER_k8000Hz;
41587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->AudioEncParams.ChannelNum = M4ENCODER_kMono;
41597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                if( pC->pReaderAudioStream->m_samplingFrequency
41617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    != 8000 )
41627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                {
41637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Format = M4ENCODER_kAMRNB;
41647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                }
41657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->AudioEncParams.SpecifParam.AmrSID =
41667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4ENCODER_kAmrNoSID;
41677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                break;
41687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            case M4VIDEOEDITING_kAAC:
41707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_TRACE3_0(
41717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    "M4MCS_setOutputParams calling \
41727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4MCS_setCurrentAudioEncoder M4VIDEOEDITING_kNull, AAC");
41737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                err = M4MCS_setCurrentAudioEncoder(pContext,
41747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->InputFileProperties.AudioStreamType);
41757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4ERR_CHECK_RETURN(err);
41767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->AudioEncParams.Format = M4ENCODER_kAAC;
41787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->AudioEncParams.SpecifParam.AacParam.Regulation =
41797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    M4ENCODER_kAacRegulNone; //M4ENCODER_kAacBitReservoir
41807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->AudioEncParams.Frequency = M4ENCODER_k16000Hz;
41817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->AudioEncParams.Frequency = M4ENCODER_k16000Hz;
41827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                switch( pC->pReaderAudioStream->
41847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    m_samplingFrequency )
41857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                {
41867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                case 16000:
41877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Frequency =
41887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4ENCODER_k16000Hz;
41897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
41907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                case 22050:
41927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Frequency =
41937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4ENCODER_k22050Hz;
41947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
41957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
41967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                case 24000:
41977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Frequency =
41987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4ENCODER_k24000Hz;
41997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
42007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                case 32000:
42027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Frequency =
42037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4ENCODER_k32000Hz;
42047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
42057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                case 44100:
42077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Frequency =
42087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4ENCODER_k44100Hz;
42097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
42107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                case 48000:
42127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Frequency =
42137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4ENCODER_k48000Hz;
42147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
42157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                default:
42177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Format = M4ENCODER_kAAC;
42187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
42197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
42207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            /* unused */
42217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.SpecifParam.AacParam.bIS =
42227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_FALSE;
42237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.SpecifParam.AacParam.bMS =
42247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_FALSE;
42257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.SpecifParam.AacParam.bPNS =
42267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_FALSE;
42277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.SpecifParam.AacParam.bTNS =
42287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_FALSE;
42297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            /* TODO change into highspeed asap */
42307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.SpecifParam.AacParam.bHighSpeed =
42317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4OSA_FALSE;
42327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
42337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        case M4VIDEOEDITING_kMP3:
42357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_TRACE3_0(
42367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                "M4MCS_setOutputParams calling\
42377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4MCS_setCurrentAudioEncoder M4VIDEOEDITING_kNull, MP3");
42387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err = M4MCS_setCurrentAudioEncoder(pContext,
42397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->InputFileProperties.AudioStreamType);
42407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4ERR_CHECK_RETURN(err);
42417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.Format = M4ENCODER_kMP3;
42437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->AudioEncParams.Frequency = M4ENCODER_k16000Hz;
42447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            switch( pC->pReaderAudioStream->
42467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                m_samplingFrequency )
42477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            {
42487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                case 8000:
42497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Frequency =
42507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4ENCODER_k8000Hz;
42517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
42527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                case 16000:
42547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Frequency =
42557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4ENCODER_k16000Hz;
42567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
42577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                case 22050:
42597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Frequency =
42607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4ENCODER_k22050Hz;
42617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
42627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                case 24000:
42647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Frequency =
42657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4ENCODER_k24000Hz;
42667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
42677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                case 32000:
42697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Frequency =
42707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4ENCODER_k32000Hz;
42717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
42727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                case 44100:
42747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Frequency =
42757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4ENCODER_k44100Hz;
42767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
42777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                case 48000:
42797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Frequency =
42807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                        M4ENCODER_k48000Hz;
42817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
42827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                default:
42847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    pC->AudioEncParams.Format = M4ENCODER_kMP3;
42857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    break;
42867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            }
42877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
42887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
42897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        case M4VIDEOEDITING_kEVRC:
42907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        case M4VIDEOEDITING_kUnsupportedAudio:
42917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        default:
42927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_TRACE1_1(
42937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                "M4MCS_setOutputParams: Output audio format (%d) is\
42947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                incompatible with audio effects, returning \
42957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4MCS_ERR_UNDEFINED_OUTPUT_AUDIO_FORMAT",
42967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pC->InputFileProperties.AudioStreamType);
42977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return M4MCS_ERR_UNDEFINED_OUTPUT_AUDIO_FORMAT;
42987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
42997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
43007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
43017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* EVRC
43027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    //            case M4VIDEOEDITING_kEVRC:
43037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    //
43047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    //                err = M4MCS_setCurrentAudioEncoder(pContext, pParams->\
43057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    //                    OutputAudioFormat);
43067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    //                M4ERR_CHECK_RETURN(err);
43077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    //
43087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    //                pC->AudioEncParams.Format = M4ENCODER_kEVRC;
43097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    //                pC->AudioEncParams.Frequency = M4ENCODER_k8000Hz;
43107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    //                pC->AudioEncParams.ChannelNum = M4ENCODER_kMono;
43117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    //                break; */
43127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
43137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                default:
43147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1("M4MCS_setOutputParams: Undefined output audio format (%d),\
43157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                   returning M4MCS_ERR_UNDEFINED_OUTPUT_AUDIO_FORMAT",
43167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                   pParams->OutputAudioFormat);
43177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4MCS_ERR_UNDEFINED_OUTPUT_AUDIO_FORMAT;
43187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
43197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
43207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
43217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pParams->pOutputPCMfile != M4OSA_NULL )
43227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
43237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pOutputPCMfile = pParams->pOutputPCMfile;
43247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
43257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Open output PCM file */
43267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pOsaFileWritPtr->openWrite(&(pC->pOutputPCMfile),
43277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pParams->pOutputPCMfile, M4OSA_kFileWrite);
43287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
43297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
43307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
43317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pOutputPCMfile = M4OSA_NULL;
43327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
43337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
43347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*Store media rendering parameter into the internal context*/
43357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->MediaRendering = pParams->MediaRendering;
43367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
43377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Add audio effects*/
43387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*Copy MCS effects structure into internal context*/
43397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pParams->nbEffects > 0 )
43407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
43417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 j = 0;
43427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->nbEffects = pParams->nbEffects;
4343694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        pC->pEffects = (M4MCS_EffectSettings *)M4OSA_32bitAlignedMalloc(pC->nbEffects \
43447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *sizeof(M4MCS_EffectSettings), M4MCS,
43457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Char *)"Allocation of effects list");
43467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
43477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->pEffects == M4OSA_NULL )
43487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
43497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("M4MCS_setOutputParams(): allocation error");
43507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
43517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
43527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
43537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        for ( j = 0; j < pC->nbEffects; j++ )
43547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
43557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Copy effect to "local" structure */
435632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            memcpy((void *) &(pC->pEffects[j]),
435732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                (void *) &(pParams->pEffects[j]),
43587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                sizeof(M4MCS_EffectSettings));
43597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
43607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            switch( pC->pEffects[j].AudioEffectType )
43617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
43627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4MCS_kAudioEffectType_None:
43637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE3_1(
43647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_setOutputParams(): effect type %i is None", j);
43657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pEffects[j].pExtAudioEffectFctCtxt = M4OSA_NULL;
43667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pEffects[j].ExtAudioEffectFct = M4OSA_NULL;
43677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
43687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
43697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4MCS_kAudioEffectType_FadeIn:
43707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE3_1(
43717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_setOutputParams(): effect type %i is FadeIn", j);
43727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pEffects[j].pExtAudioEffectFctCtxt = M4OSA_NULL;
43737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pEffects[j].ExtAudioEffectFct =
43747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4MCS_editAudioEffectFct_FadeIn;
43757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
43767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
43777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4MCS_kAudioEffectType_FadeOut:
43787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE3_1(
43797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_setOutputParams(): effect type %i is FadeOut",
43807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        j);
43817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pEffects[j].pExtAudioEffectFctCtxt = M4OSA_NULL;
43827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pEffects[j].ExtAudioEffectFct =
43837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4MCS_editAudioEffectFct_FadeOut;
43847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
43857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
43867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4MCS_kAudioEffectType_External:
43877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE3_1(
43887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_setOutputParams(): effect type %i is External",
43897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        j);
43907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
43917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pParams->pEffects != M4OSA_NULL )
43927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
43937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( pParams->pEffects[j].ExtAudioEffectFct
43947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            == M4OSA_NULL )
43957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
43967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_TRACE1_1("M4MCS_setOutputParams(): no external effect function\
43977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                           associated to external effect number %i", j);
43987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return M4ERR_PARAMETER;
43997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
44007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pEffects[j].pExtAudioEffectFctCtxt =
44017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pParams->pEffects[j].pExtAudioEffectFctCtxt;
44027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pEffects[j].ExtAudioEffectFct =
44047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pParams->pEffects[j].ExtAudioEffectFct;
44057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
44067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
44087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                default:
44107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_0(
44117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_setOutputParams(): effect type not recognized");
44127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4ERR_PARAMETER;
44137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
44147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
44157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
44167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
44177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
44187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->nbEffects = 0;
44197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pEffects = M4OSA_NULL;
44207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
44217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
44237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Update state automaton */
44247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->State = M4MCS_kState_SET;
44257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
44277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
44287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_setOutputParams(): returning M4NO_ERROR");
44297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
44307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
44317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
44337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
44347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_setEncodingParams(M4MCS_Context pContext, M4MCS_EncodingParams* pRates)
44357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Set the values of the encoding parameters
44367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    Must be called before M4MCS_checkParamsAndStart().
44377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext           (IN) MCS context
44387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pRates             (IN) Transcoding parameters
44397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR:         No error
44407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
44417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
44427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_AUDIOBITRATE_TOO_HIGH: Audio bitrate too high (we limit to 96 kbps)
44437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_AUDIOBITRATE_TOO_LOW: Audio bitrate is too low (16 kbps min for aac, 12.2
44447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                            for amr, 8 for mp3)
44457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT: Begin cut and End cut are equals
44467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_BEGIN_CUT_LARGER_THAN_DURATION: Begin cut time is larger than the input clip
44477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                                     duration
44487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_END_CUT_SMALLER_THAN_BEGIN_CUT: End cut time is smaller than begin cut time
44497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_MAXFILESIZE_TOO_SMALL: Not enough space to store whole output file at given
44507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                             bitrates
44517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_VIDEOBITRATE_TOO_HIGH: Video bitrate too high (we limit to 800 kbps)
44527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_VIDEOBITRATE_TOO_LOW:  Video bitrate too low
44537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
44547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
44557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_setEncodingParams( M4MCS_Context pContext,
44567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                  M4MCS_EncodingParams *pRates )
44577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
44587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext *)(pContext);
44597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 j = 0;
44607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_2(
44627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_setEncodingParams called with pContext=0x%x, pRates=0x%x",
44637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pContext, pRates);
44647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
44667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
44677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
44687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_setEncodingParams: pContext is M4OSA_NULL");
44697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pRates), M4ERR_PARAMETER,
44707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_setEncodingParams: pRates is M4OSA_NULL");
44717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
44737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_bIsStillPicture )
44757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
44767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
44777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Call the corresponding still picture MCS function*/
44787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_stillPicSetEncodingParams(pC, pRates);
44797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
44807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
44827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
44847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check state automaton */
44857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4MCS_kState_SET != pC->State )
44877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
44887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
44897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_setEncodingParams(): Wrong State (%d), returning M4ERR_STATE",
44907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->State);
44917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_STATE;
44927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
44937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
44947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Set given values */
44957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiVideoBitrate = pRates->OutputVideoBitrate;
44967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiAudioBitrate = pRates->OutputAudioBitrate;
44977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiBeginCutTime = pRates->BeginCutTime;
44987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiEndCutTime = pRates->EndCutTime;
44997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiMaxFileSize = pRates->OutputFileSize;
45007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
45017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
45027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check begin cut time validity */
45037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->uiBeginCutTime >= pC->InputFileProperties.uiClipDuration )
45047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
45057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_2("M4MCS_setEncodingParams(): Begin cut larger than duration (%d>%d),\
45067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                       returning M4MCS_ERR_BEGIN_CUT_LARGER_THAN_DURATION",
45077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                       pC->uiBeginCutTime, pC->InputFileProperties.uiClipDuration);
45087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_ERR_BEGIN_CUT_LARGER_THAN_DURATION;
45097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
45107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
45117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
45127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * If end cut time is too large, we set it to the clip duration */
45137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->uiEndCutTime > pC->InputFileProperties.uiClipDuration )
45147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
45157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->uiEndCutTime = pC->InputFileProperties.uiClipDuration;
45167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
45177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
45187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
45197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check end cut time validity */
45207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->uiEndCutTime > 0 )
45217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
45227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->uiEndCutTime < pC->uiBeginCutTime )
45237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
45247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_2("M4MCS_setEncodingParams(): Begin cut greater than end cut (%d,%d), \
45257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                           returning M4MCS_ERR_END_CUT_SMALLER_THAN_BEGIN_CUT",
45267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                           pC->uiBeginCutTime, pC->uiEndCutTime);
45277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4MCS_ERR_END_CUT_SMALLER_THAN_BEGIN_CUT;
45287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
45297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
45307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->uiEndCutTime == pC->uiBeginCutTime )
45317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
45327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_2("M4MCS_setEncodingParams(): Begin and End cuts are equal (%d,%d),\
45337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                           returning M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT",
45347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                           pC->uiBeginCutTime, pC->uiEndCutTime);
45357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT;
45367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
45377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
45387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
45397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
45407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * FlB 2009.03.04: check audio effects start time and duration validity*/
45417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for ( j = 0; j < pC->nbEffects; j++ )
45427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
45437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 outputEndCut = pC->uiEndCutTime;
45447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
45457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->uiEndCutTime == 0 )
45467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
45477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            outputEndCut = pC->InputFileProperties.uiClipDuration;
45487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
45497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
45507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->pEffects[j].uiStartTime > (outputEndCut - pC->uiBeginCutTime) )
45517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
45527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_2("M4MCS_setEncodingParams(): Effects start time is larger than\
45537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                           duration (%d,%d), returning M4ERR_PARAMETER",
45547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                           pC->pEffects[j].uiStartTime,
45557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                           (pC->uiEndCutTime - pC->uiBeginCutTime));
45567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_PARAMETER;
45577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
45587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
45597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->pEffects[j].uiStartTime + pC->pEffects[j].uiDuration > \
45607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (outputEndCut - pC->uiBeginCutTime) )
45617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
45627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Re-adjust the effect duration until the end of the output clip*/
45637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pEffects[j].uiDuration = (outputEndCut - pC->uiBeginCutTime) - \
45647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pEffects[j].uiStartTime;
45657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
45667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
45677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
45687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check audio bitrate consistency */
45697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->noaudio == M4OSA_FALSE)
45707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->AudioEncParams.Format != M4ENCODER_kAudioNULL) )
45717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
45727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->uiAudioBitrate != M4VIDEOEDITING_kUndefinedBitrate )
45737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
45747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->AudioEncParams.Format == M4ENCODER_kAMRNB )
45757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
45767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->uiAudioBitrate > M4VIDEOEDITING_k12_2_KBPS )
45777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4MCS_ERR_AUDIOBITRATE_TOO_HIGH;
45787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
45797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->uiAudioBitrate < M4VIDEOEDITING_k12_2_KBPS )
45807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4MCS_ERR_AUDIOBITRATE_TOO_LOW;
45817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
45827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //EVRC
45837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //            else if(pC->AudioEncParams.Format == M4ENCODER_kEVRC)
45847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //            {
45857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //                if(pC->uiAudioBitrate > M4VIDEOEDITING_k9_2_KBPS)
45867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //                    return M4MCS_ERR_AUDIOBITRATE_TOO_HIGH;
45877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //                if(pC->uiAudioBitrate < M4VIDEOEDITING_k9_2_KBPS)
45887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //                     return M4MCS_ERR_AUDIOBITRATE_TOO_LOW;
45897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //            }
45907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*FlB 26.02.2009: add mp3 as mcs output format, add mp3 encoder*/
45917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if( pC->AudioEncParams.Format == M4ENCODER_kMP3 )
45927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
45937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->AudioEncParams.Frequency >= M4ENCODER_k32000Hz )
45947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
45957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /*Mpeg layer 1*/
45967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->uiAudioBitrate > 320000 )
45977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4MCS_ERR_AUDIOBITRATE_TOO_HIGH;
45987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
45997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->uiAudioBitrate < 32000 )
46007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4MCS_ERR_AUDIOBITRATE_TOO_LOW;
46017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
46027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else if( pC->AudioEncParams.Frequency >= M4ENCODER_k16000Hz )
46037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
46047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /*Mpeg layer 2*/
46057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->uiAudioBitrate > 160000 )
46067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4MCS_ERR_AUDIOBITRATE_TOO_HIGH;
46077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
46087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( ( pC->uiAudioBitrate < 8000
46097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && pC->AudioEncParams.ChannelNum == M4ENCODER_kMono)
46107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        || (pC->uiAudioBitrate < 16000
46117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && pC->AudioEncParams.ChannelNum
46127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        == M4ENCODER_kStereo) )
46137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4MCS_ERR_AUDIOBITRATE_TOO_LOW;
46147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
46157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else if( pC->AudioEncParams.Frequency == M4ENCODER_k8000Hz
46167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    || pC->AudioEncParams.Frequency == M4ENCODER_k11025Hz
46177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    || pC->AudioEncParams.Frequency == M4ENCODER_k12000Hz )
46187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
46197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /*Mpeg layer 2.5*/
46207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->uiAudioBitrate > 64000 )
46217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4MCS_ERR_AUDIOBITRATE_TOO_HIGH;
46227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
46237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( ( pC->uiAudioBitrate < 8000
46247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && pC->AudioEncParams.ChannelNum == M4ENCODER_kMono)
46257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        || (pC->uiAudioBitrate < 16000
46267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && pC->AudioEncParams.ChannelNum
46277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        == M4ENCODER_kStereo) )
46287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4MCS_ERR_AUDIOBITRATE_TOO_LOW;
46297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
46307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else
46317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
46327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1("M4MCS_setEncodingParams: MP3 audio sampling frequency error\
46337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                   (%d)", pC->AudioEncParams.Frequency);
46347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4ERR_PARAMETER;
46357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
46367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
46377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
46387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
46397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->uiAudioBitrate > M4VIDEOEDITING_k192_KBPS )
46407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4MCS_ERR_AUDIOBITRATE_TOO_HIGH;
46417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
46427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->AudioEncParams.ChannelNum == M4ENCODER_kMono )
46437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
46447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->uiAudioBitrate < M4VIDEOEDITING_k16_KBPS )
46457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4MCS_ERR_AUDIOBITRATE_TOO_LOW;
46467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
46477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else
46487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
46497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->uiAudioBitrate < M4VIDEOEDITING_k32_KBPS )
46507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4MCS_ERR_AUDIOBITRATE_TOO_LOW;
46517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
46527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
46537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
46547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
46557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
46567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
46577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* NULL audio : copy input file bitrate */
46587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->uiAudioBitrate = pC->InputFileProperties.uiAudioBitrate;
46597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
46607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
46617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check video bitrate consistency */
46627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->novideo == M4OSA_FALSE)
46637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->EncodingVideoFormat != M4ENCODER_kNULL) )
46647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
46657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->uiVideoBitrate != M4VIDEOEDITING_kUndefinedBitrate )
46667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
46677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->uiVideoBitrate > M4VIDEOEDITING_k8_MBPS )
46687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4MCS_ERR_VIDEOBITRATE_TOO_HIGH;
46697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
46707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->uiVideoBitrate < M4VIDEOEDITING_k16_KBPS )
46717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4MCS_ERR_VIDEOBITRATE_TOO_LOW;
46727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
46737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
46747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
46757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
46767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* NULL video : copy input file bitrate */
46777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->uiVideoBitrate = pC->InputFileProperties.uiVideoBitrate;
46787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
46797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
46807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pRates->OutputVideoTimescale <= 30000
46817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && pRates->OutputVideoTimescale > 0 )
46827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
46837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->outputVideoTimescale = pRates->OutputVideoTimescale;
46847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
46857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
46867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check file size */
46877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4MCS_intCheckMaxFileSize(pC);
46887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
46897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
46907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
46917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
46927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_getExtendedEncodingParams(M4MCS_Context pContext, M4MCS_EncodingParams* pRates)
46937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Get the extended values of the encoding parameters
46947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    Could be called after M4MCS_setEncodingParams.
46957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext           (IN) MCS context
46967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pRates             (OUT) Transcoding parameters
46977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR:         No error
46987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
46997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
47007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT: Encoding settings would produce a null duration
47017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                             clip = encoding is impossible
47027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
47037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
47047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_getExtendedEncodingParams( M4MCS_Context pContext,
47057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                          M4MCS_EncodingParams *pRates )
47067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
47077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext *)(pContext);
47087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
47097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 minaudiobitrate;
47107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 minvideobitrate;
47117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 maxcombinedbitrate;
47127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
47137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 calcbitrate;
47147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
47157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 maxduration;
47167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 calcduration;
47177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
47187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool fixed_audio = M4OSA_FALSE;
47197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool fixed_video = M4OSA_FALSE;
47207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
47217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
47227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
47237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_bIsStillPicture )
47247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
47257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
47267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Call the corresponding still picture MCS function*/
47277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_stillPicGetExtendedEncodingParams(pC, pRates);
47287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
47297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
47307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
47317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
47327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pRates->OutputVideoBitrate =
47337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4MCS_intGetNearestBitrate(pC->uiVideoBitrate, 0);
47347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pRates->OutputAudioBitrate =
47357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4MCS_intGetNearestBitrate(pC->uiAudioBitrate, 0);
47367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pRates->BeginCutTime = pC->uiBeginCutTime;
47377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pRates->EndCutTime = pC->uiEndCutTime;
47387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pRates->OutputFileSize = pC->uiMaxFileSize;
47397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
47407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
47417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check state automaton */
47427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4MCS_kState_SET != pC->State )
47437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
47447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1("M4MCS_getExtendedEncodingParams(): Wrong State (%d),\
47457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                       returning M4ERR_STATE", pC->State);
47467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_STATE;
47477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
47487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
47497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Compute min audio bitrate */
47507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->noaudio )
47517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
47527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        fixed_audio = M4OSA_TRUE;
47537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pRates->OutputAudioBitrate = 0;
47547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        minaudiobitrate = 0;
47557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
47567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( pC->AudioEncParams.Format == M4ENCODER_kAudioNULL )
47577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
47587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        fixed_audio = M4OSA_TRUE;
47597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pRates->OutputAudioBitrate = pC->InputFileProperties.uiAudioBitrate;
47607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        minaudiobitrate = pC->InputFileProperties.uiAudioBitrate;
47617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
47627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
47637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
47647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->AudioEncParams.Format == M4ENCODER_kAMRNB )
47657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
47667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            fixed_audio = M4OSA_TRUE;
47677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pRates->OutputAudioBitrate = M4VIDEOEDITING_k12_2_KBPS;
47687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            minaudiobitrate = M4VIDEOEDITING_k12_2_KBPS;
47697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
47707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //EVRC
47717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //        if(pC->AudioEncParams.Format == M4ENCODER_kEVRC)
47727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //        {
47737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //            fixed_audio = M4OSA_TRUE;
47747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //            pRates->OutputAudioBitrate = M4VIDEOEDITING_k9_2_KBPS;
47757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //            minaudiobitrate = M4VIDEOEDITING_k9_2_KBPS;
47767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //        }
47777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*FlB 26.02.2009: add mp3 as mcs output format*/
47787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else if( pC->AudioEncParams.Format == M4ENCODER_kMP3 )
47797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
47807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            minaudiobitrate =
47817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4VIDEOEDITING_k32_KBPS; /*Default min audio bitrate for MPEG layer 1,
47827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                             for both mono and stereo channels*/
47837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
47847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
47857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
47867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            minaudiobitrate = (pC->AudioEncParams.ChannelNum == M4ENCODER_kMono)
47877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ? M4VIDEOEDITING_k16_KBPS : M4VIDEOEDITING_k32_KBPS;
47887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
47897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
47907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
47917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check audio bitrate is in the correct range */
47927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( fixed_audio == M4OSA_FALSE )
47937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
47947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( pC->uiAudioBitrate > 0)
47957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            && (pRates->OutputAudioBitrate < minaudiobitrate) )
47967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
47977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pRates->OutputAudioBitrate = minaudiobitrate;
47987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
47997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
48007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pRates->OutputAudioBitrate > M4VIDEOEDITING_k96_KBPS )
48017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
48027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pRates->OutputAudioBitrate = M4VIDEOEDITING_k96_KBPS;
48037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
48047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
48057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
48067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Compute min video bitrate */
48077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->novideo )
48087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
48097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        fixed_video = M4OSA_TRUE;
48107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pRates->OutputVideoBitrate = 0;
48117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        minvideobitrate = 0;
48127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
48137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( pC->EncodingVideoFormat == M4ENCODER_kNULL )
48147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
48157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        fixed_video = M4OSA_TRUE;
48167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pRates->OutputVideoBitrate = pC->InputFileProperties.uiVideoBitrate;
48177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        minvideobitrate = pC->InputFileProperties.uiVideoBitrate;
48187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
48197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
48207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
48217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        minvideobitrate = M4VIDEOEDITING_k16_KBPS;
48227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
48237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
48247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check video bitrate is in the correct range */
48257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( fixed_video == M4OSA_FALSE )
48267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
48277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( pC->uiVideoBitrate > 0)
48287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            && (pRates->OutputVideoBitrate < minvideobitrate) )
48297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
48307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pRates->OutputVideoBitrate = minvideobitrate;
48317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
48327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*+ New Encoder bitrates */
48337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pRates->OutputVideoBitrate > M4VIDEOEDITING_k8_MBPS )
48347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
48357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pRates->OutputVideoBitrate = M4VIDEOEDITING_k8_MBPS;
48367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
48377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*- New Encoder bitrates */
48387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
48397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
48407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check cut times are in correct range */
48417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pRates->BeginCutTime >= pC->InputFileProperties.uiClipDuration)
48427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || (( pRates->BeginCutTime >= pRates->EndCutTime)
48437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pRates->EndCutTime > 0)) )
48447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
48457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pRates->BeginCutTime = 0;
48467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pRates->EndCutTime = 0;
48477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
48487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
48497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pRates->EndCutTime == 0 )
48507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        calcduration =
48517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiClipDuration - pRates->BeginCutTime;
48527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
48537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        calcduration = pRates->EndCutTime - pRates->BeginCutTime;
48547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
48557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* priority 1 : max file size */
48567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pRates->OutputFileSize == 0 )
48577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
48587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* we can put maximum values for all undefined parameters */
48597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pRates->EndCutTime == 0 )
48607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
48617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pRates->EndCutTime = pC->InputFileProperties.uiClipDuration;
48627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
48637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
48647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( pRates->OutputAudioBitrate == M4VIDEOEDITING_kUndefinedBitrate)
48657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            && (fixed_audio == M4OSA_FALSE) )
48667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
48677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pRates->OutputAudioBitrate = M4VIDEOEDITING_k96_KBPS;
48687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
48697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
48707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( pRates->OutputVideoBitrate == M4VIDEOEDITING_kUndefinedBitrate)
48717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            && (fixed_video == M4OSA_FALSE) )
48727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
48737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*+ New Encoder bitrates */
48747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pRates->OutputVideoBitrate = M4VIDEOEDITING_k8_MBPS;
48757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*- New Encoder bitrates */
48767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
48777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
48787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
48797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
48807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* compute max duration */
48817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        maxduration = (M4OSA_UInt32)(pRates->OutputFileSize
48827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            / M4MCS_MOOV_OVER_FILESIZE_RATIO
48837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            / (minvideobitrate + minaudiobitrate) * 8000.0);
48847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
48857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( maxduration
48867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            + pRates->BeginCutTime > pC->InputFileProperties.uiClipDuration )
48877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
48887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            maxduration =
48897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.uiClipDuration - pRates->BeginCutTime;
48907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
48917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
48927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* priority 2 : cut times */
48937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( pRates->BeginCutTime > 0) || (pRates->EndCutTime > 0) )
48947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
48957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( calcduration > maxduration )
48967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
48977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                calcduration = maxduration;
48987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
48997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
49007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( calcduration == 0 )
49017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
49027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT;
49037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
49047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
49057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            maxcombinedbitrate = (M4OSA_UInt32)(pRates->OutputFileSize
49067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                / M4MCS_MOOV_OVER_FILESIZE_RATIO / (calcduration / 8000.0));
49077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
49087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* audio and video bitrates */
49097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( ( pRates->OutputAudioBitrate
49107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                == M4VIDEOEDITING_kUndefinedBitrate)
49117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                && (pRates->OutputVideoBitrate
49127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                == M4VIDEOEDITING_kUndefinedBitrate) )
49137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
49147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* set audio = 1/3 and video = 2/3 */
49157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( fixed_audio == M4OSA_FALSE )
49167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
49177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->novideo )
49187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pRates->OutputAudioBitrate =
49197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4MCS_intGetNearestBitrate(maxcombinedbitrate, 0);
49207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else
49217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pRates->OutputAudioBitrate =
49227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4MCS_intGetNearestBitrate(maxcombinedbitrate / 3,
49237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        0);
49247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
49257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pRates->OutputAudioBitrate < minaudiobitrate )
49267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pRates->OutputAudioBitrate = minaudiobitrate;
49277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
49287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pRates->OutputAudioBitrate > M4VIDEOEDITING_k96_KBPS )
49297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pRates->OutputAudioBitrate = M4VIDEOEDITING_k96_KBPS;
49307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
49317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
49327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( fixed_video == M4OSA_FALSE )
49337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
49347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pRates->OutputVideoBitrate =
49357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4MCS_intGetNearestBitrate(maxcombinedbitrate
49367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        - pRates->OutputAudioBitrate, 0);
49377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
49387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pRates->OutputVideoBitrate < minvideobitrate )
49397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pRates->OutputVideoBitrate = minvideobitrate;
49407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
49417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pRates->OutputVideoBitrate > M4VIDEOEDITING_k8_MBPS )
49427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pRates->OutputVideoBitrate =
49437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VIDEOEDITING_k8_MBPS; /*+ New Encoder
49447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                bitrates */
49457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
49467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
49477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
49487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
49497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* priority 3 : audio bitrate */
49507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pRates->OutputAudioBitrate
49517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    != M4VIDEOEDITING_kUndefinedBitrate )
49527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
49537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    while( ( fixed_audio == M4OSA_FALSE)
49547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (pRates->OutputAudioBitrate >= minaudiobitrate)
49557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (pRates->OutputAudioBitrate
49567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        + minvideobitrate > maxcombinedbitrate) )
49577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
49587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pRates->OutputAudioBitrate =
49597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4MCS_intGetNearestBitrate(
49607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pRates->OutputAudioBitrate, -1);
49617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
49627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
49637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( ( fixed_audio == M4OSA_FALSE)
49647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (pRates->OutputAudioBitrate < minaudiobitrate) )
49657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
49667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pRates->OutputAudioBitrate = minaudiobitrate;
49677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
49687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
49697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    calcbitrate = M4MCS_intGetNearestBitrate(
49707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    maxcombinedbitrate
49717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    - pRates->OutputAudioBitrate, 0);
49727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
49737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( calcbitrate < minvideobitrate )
49747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        calcbitrate = minvideobitrate;
49757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
49767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( calcbitrate > M4VIDEOEDITING_k8_MBPS )
49777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        calcbitrate = M4VIDEOEDITING_k8_MBPS;
49787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
49797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( ( fixed_video == M4OSA_FALSE)
49807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (( pRates->OutputVideoBitrate
49817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        == M4VIDEOEDITING_kUndefinedBitrate)
49827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        || (pRates->OutputVideoBitrate > calcbitrate)) )
49837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
49847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pRates->OutputVideoBitrate = calcbitrate;
49857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
49867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
49877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else
49887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
49897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* priority 4 : video bitrate */
49907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pRates->OutputVideoBitrate
49917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        != M4VIDEOEDITING_kUndefinedBitrate )
49927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
49937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        while( ( fixed_video == M4OSA_FALSE)
49947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            && (pRates->OutputVideoBitrate >= minvideobitrate)
49957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            && (pRates->OutputVideoBitrate
49967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            + minaudiobitrate > maxcombinedbitrate) )
49977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
49987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pRates->OutputVideoBitrate =
49997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                M4MCS_intGetNearestBitrate(
50007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                pRates->OutputVideoBitrate, -1);
50017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
50027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( ( fixed_video == M4OSA_FALSE)
50047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            && (pRates->OutputVideoBitrate < minvideobitrate) )
50057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
50067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pRates->OutputVideoBitrate = minvideobitrate;
50077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
50087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        calcbitrate =
50107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4MCS_intGetNearestBitrate(maxcombinedbitrate
50117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            - pRates->OutputVideoBitrate, 0);
50127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( calcbitrate < minaudiobitrate )
50147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            calcbitrate = minaudiobitrate;
50157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( calcbitrate > M4VIDEOEDITING_k96_KBPS )
50177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            calcbitrate = M4VIDEOEDITING_k96_KBPS;
50187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( ( fixed_audio == M4OSA_FALSE)
50207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            && (( pRates->OutputAudioBitrate
50217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            == M4VIDEOEDITING_kUndefinedBitrate)
50227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            || (pRates->OutputAudioBitrate > calcbitrate)) )
50237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
50247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pRates->OutputAudioBitrate = calcbitrate;
50257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
50267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
50277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
50287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
50297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
50307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
50317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
50327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* priority 3 : audio bitrate */
50337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pRates->OutputAudioBitrate != M4VIDEOEDITING_kUndefinedBitrate )
50347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
50357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* priority 4 : video bitrate */
50367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pRates->OutputVideoBitrate
50377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    != M4VIDEOEDITING_kUndefinedBitrate )
50387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
50397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* compute max duration */
50407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    maxduration = (M4OSA_UInt32)(pRates->OutputFileSize
50417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / M4MCS_MOOV_OVER_FILESIZE_RATIO
50427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / (pRates->OutputVideoBitrate
50437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        + pRates->OutputAudioBitrate) * 8000.0);
50447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( maxduration + pRates->BeginCutTime
50467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        > pC->InputFileProperties.uiClipDuration )
50477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
50487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        maxduration = pC->InputFileProperties.uiClipDuration
50497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            - pRates->BeginCutTime;
50507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
50517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( calcduration > maxduration )
50537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
50547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        calcduration = maxduration;
50557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
50567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( calcduration == 0 )
50587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
50597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT;
50607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
50617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
50627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else
50637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
50647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* start with min video bitrate */
50657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pRates->OutputVideoBitrate = minvideobitrate;
50667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* compute max duration */
50687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    maxduration = (M4OSA_UInt32)(pRates->OutputFileSize
50697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / M4MCS_MOOV_OVER_FILESIZE_RATIO
50707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / (pRates->OutputVideoBitrate
50717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        + pRates->OutputAudioBitrate) * 8000.0);
50727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( maxduration + pRates->BeginCutTime
50747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        > pC->InputFileProperties.uiClipDuration )
50757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
50767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        maxduration = pC->InputFileProperties.uiClipDuration
50777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            - pRates->BeginCutTime;
50787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
50797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( calcduration > maxduration )
50817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
50827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        calcduration = maxduration;
50837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
50847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( calcduration == 0 )
50867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
50877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT;
50887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
50897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* search max possible video bitrate */
50917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    maxcombinedbitrate = (M4OSA_UInt32)(pRates->OutputFileSize
50927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / M4MCS_MOOV_OVER_FILESIZE_RATIO
50937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / (calcduration / 8000.0));
50947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
50957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    while( ( fixed_video == M4OSA_FALSE)
50967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (pRates->OutputVideoBitrate
50977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        < M4VIDEOEDITING_k8_MBPS) ) /*+ New Encoder bitrates */
50987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
50997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        calcbitrate = M4MCS_intGetNearestBitrate(
51007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pRates->OutputVideoBitrate, +1);
51017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
51027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( calcbitrate
51037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            + pRates->OutputAudioBitrate <= maxcombinedbitrate )
51047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pRates->OutputVideoBitrate = calcbitrate;
51057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        else
51067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
51077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
51087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
51097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
51107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
51117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
51127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* priority 4 : video bitrate */
51137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pRates->OutputVideoBitrate
51147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    != M4VIDEOEDITING_kUndefinedBitrate )
51157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
51167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* start with min audio bitrate */
51177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pRates->OutputAudioBitrate = minaudiobitrate;
51187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
51197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* compute max duration */
51207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    maxduration = (M4OSA_UInt32)(pRates->OutputFileSize
51217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / M4MCS_MOOV_OVER_FILESIZE_RATIO
51227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / (pRates->OutputVideoBitrate
51237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        + pRates->OutputAudioBitrate) * 8000.0);
51247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
51257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( maxduration + pRates->BeginCutTime
51267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        > pC->InputFileProperties.uiClipDuration )
51277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
51287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        maxduration = pC->InputFileProperties.uiClipDuration
51297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            - pRates->BeginCutTime;
51307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
51317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
51327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( calcduration > maxduration )
51337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
51347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        calcduration = maxduration;
51357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
51367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
51377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( calcduration == 0 )
51387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
51397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT;
51407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
51417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
51427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* search max possible audio bitrate */
51437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    maxcombinedbitrate = (M4OSA_UInt32)(pRates->OutputFileSize
51447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / M4MCS_MOOV_OVER_FILESIZE_RATIO
51457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / (calcduration / 8000.0));
51467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
51477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    while( ( fixed_audio == M4OSA_FALSE)
51487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (pRates->OutputAudioBitrate
51497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        < M4VIDEOEDITING_k96_KBPS) )
51507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
51517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        calcbitrate = M4MCS_intGetNearestBitrate(
51527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pRates->OutputAudioBitrate, +1);
51537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
51547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( calcbitrate
51557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            + pRates->OutputVideoBitrate <= maxcombinedbitrate )
51567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pRates->OutputAudioBitrate = calcbitrate;
51577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        else
51587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            break;
51597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
51607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
51617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else
51627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
51637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* compute max duration */
51647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    maxduration = (M4OSA_UInt32)(pRates->OutputFileSize
51657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / M4MCS_MOOV_OVER_FILESIZE_RATIO
51667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / (minvideobitrate + minaudiobitrate) * 8000.0);
51677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
51687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( maxduration + pRates->BeginCutTime
51697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        > pC->InputFileProperties.uiClipDuration )
51707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
51717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        maxduration = pC->InputFileProperties.uiClipDuration
51727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            - pRates->BeginCutTime;
51737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
51747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
51757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( calcduration > maxduration )
51767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
51777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        calcduration = maxduration;
51787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
51797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
51807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( calcduration == 0 )
51817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
51827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT;
51837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
51847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
51857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* set audio = 1/3 and video = 2/3 */
51867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    maxcombinedbitrate = (M4OSA_UInt32)(pRates->OutputFileSize
51877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / M4MCS_MOOV_OVER_FILESIZE_RATIO
51887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        / (calcduration / 8000.0));
51897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
51907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( fixed_audio == M4OSA_FALSE )
51917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
51927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( pC->novideo )
51937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pRates->OutputAudioBitrate =
51947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4MCS_intGetNearestBitrate(maxcombinedbitrate,
51957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            0);
51967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        else
51977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pRates->OutputAudioBitrate =
51987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4MCS_intGetNearestBitrate(maxcombinedbitrate
51997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            / 3, 0);
52007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
52017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( pRates->OutputAudioBitrate < minaudiobitrate )
52027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pRates->OutputAudioBitrate = minaudiobitrate;
52037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
52047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( pRates->OutputAudioBitrate
52057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        > M4VIDEOEDITING_k96_KBPS )
52067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pRates->OutputAudioBitrate =
52077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VIDEOEDITING_k96_KBPS;
52087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
52097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
52107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( fixed_video == M4OSA_FALSE )
52117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
52127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pRates->OutputVideoBitrate =
52137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4MCS_intGetNearestBitrate(maxcombinedbitrate
52147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            - pRates->OutputAudioBitrate, 0);
52157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
52167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( pRates->OutputVideoBitrate < minvideobitrate )
52177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pRates->OutputVideoBitrate = minvideobitrate;
52187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
52197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( pRates->OutputVideoBitrate
52207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        > M4VIDEOEDITING_k8_MBPS )
52217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pRates->OutputVideoBitrate =
52227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4VIDEOEDITING_k8_MBPS; /*+ New Encoder
52237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                bitrates */
52247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
52257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
52267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
52277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
52287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
52297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
52307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* recompute max duration with final bitrates */
52317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pRates->OutputFileSize > 0 )
52327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
52337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        maxduration = (M4OSA_UInt32)(pRates->OutputFileSize
52347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            / M4MCS_MOOV_OVER_FILESIZE_RATIO
52357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            / (pRates->OutputVideoBitrate + pRates->OutputAudioBitrate)
52367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * 8000.0);
52377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
52387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
52397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
52407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        maxduration = pC->InputFileProperties.uiClipDuration;
52417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
52427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
52437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( maxduration
52447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        + pRates->BeginCutTime > pC->InputFileProperties.uiClipDuration )
52457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
52467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        maxduration =
52477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.uiClipDuration - pRates->BeginCutTime;
52487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
52497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
52507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pRates->EndCutTime == 0 )
52517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
52527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pRates->EndCutTime = pRates->BeginCutTime + maxduration;
52537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
52547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
52557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
52567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        calcduration = pRates->EndCutTime - pRates->BeginCutTime;
52577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
52587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( calcduration > maxduration )
52597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
52607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pRates->EndCutTime = pRates->BeginCutTime + maxduration;
52617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
52627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
52637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
52647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Should never happen : constraints are too strong */
52657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pRates->EndCutTime == pRates->BeginCutTime )
52667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
52677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT;
52687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
52697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
52707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* estimated resulting file size */
52717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pRates->OutputFileSize = (M4OSA_UInt32)(M4MCS_MOOV_OVER_FILESIZE_RATIO
52727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * (pRates->OutputVideoBitrate + pRates->OutputAudioBitrate)
52737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * (( pRates->EndCutTime - pRates->BeginCutTime) / 8000.0));
52747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
52757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
52767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
52777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
52787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
52797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
52807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_checkParamsAndStart(M4MCS_Context pContext)
52817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Check parameters to start
52827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
52837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext           (IN) MCS context
52847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR:         No error
52857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
52867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_STATE:        MCS is not in an appropriate state for
52877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                              this function to be called
52887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_AUDIOBITRATE_TOO_HIGH:
52897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                              Audio bitrate too high (we limit to 96 kbps)
52907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_AUDIOBITRATE_TOO_LOW:
52917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                              Audio bitrate is too low (16 kbps min for aac,
52927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                              12.2 for amr, 8 for mp3)
52937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_BEGIN_CUT_EQUALS_END_CUT:
52947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                              Begin cut and End cut are equals
52957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_BEGIN_CUT_LARGER_THAN_DURATION:
52967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                              Begin cut time is larger than the input
52977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                              clip duration
52987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_END_CUT_SMALLER_THAN_BEGIN_CUT:
52997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                              End cut time is smaller than begin cut time
53007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_MAXFILESIZE_TOO_SMALL:
53017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                              Not enough space to store whole output
53027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                              file at given bitrates
53037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_VIDEOBITRATE_TOO_HIGH:
53047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                              Video bitrate too high (we limit to 800 kbps)
53057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_VIDEOBITRATE_TOO_LOW:
53067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                              Video bitrate too low
53077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
53087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
53097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_checkParamsAndStart( M4MCS_Context pContext )
53107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
53117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext *)(pContext);
53127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_EncodingParams VerifyRates;
53137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
53147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
53167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
53177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
53187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_checkParamsAndStart: pContext is M4OSA_NULL");
53197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_SUPPORT_STILL_PICTURE
53217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_bIsStillPicture )
53237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
53247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
53257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Call the corresponding still picture MCS function*/
53267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_stillPicCheckParamsAndStart(pC);
53277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
53287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_SUPPORT_STILL_PICTURE*/
53307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
53327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check state automaton */
53337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4MCS_kState_SET != pC->State )
53357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
53367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
53377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_checkParamsAndStart(): Wrong State (%d), returning M4ERR_STATE",
53387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->State);
53397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_STATE;
53407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
53417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Audio bitrate should not stay undefined at this point */
53437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->noaudio == M4OSA_FALSE)
53447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->AudioEncParams.Format != M4ENCODER_kAudioNULL)
53457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->uiAudioBitrate == M4VIDEOEDITING_kUndefinedBitrate) )
53467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
53477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0("M4MCS_checkParamsAndStart : undefined audio bitrate");
53487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_ERR_AUDIOBITRATE_TOO_LOW;
53497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
53507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Video bitrate should not stay undefined at this point */
53527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->novideo == M4OSA_FALSE)
53537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->EncodingVideoFormat != M4ENCODER_kNULL)
53547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->uiVideoBitrate == M4VIDEOEDITING_kUndefinedBitrate) )
53557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
53567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0("M4MCS_checkParamsAndStart : undefined video bitrate");
53577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_ERR_VIDEOBITRATE_TOO_LOW;
53587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
53597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Set end cut time if necessary (not an error) */
53617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->uiEndCutTime == 0 )
53627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
53637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->uiEndCutTime = pC->InputFileProperties.uiClipDuration;
53647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
53657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Force a re-set to check validity of parameters */
53677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VerifyRates.OutputVideoBitrate = pC->uiVideoBitrate;
53687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VerifyRates.OutputAudioBitrate = pC->uiAudioBitrate;
53697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VerifyRates.BeginCutTime = pC->uiBeginCutTime;
53707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VerifyRates.EndCutTime = pC->uiEndCutTime;
53717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VerifyRates.OutputFileSize = pC->uiMaxFileSize;
53727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    VerifyRates.OutputVideoTimescale = pC->outputVideoTimescale;
53737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_setEncodingParams(pContext, &VerifyRates);
53757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
53777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check parameters consistency */
53787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( err != M4NO_ERROR )
53797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
53807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0("M4MCS_checkParamsAndStart : invalid parameter found");
53817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
53827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
53837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
53857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * All is OK : update state automaton */
53867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiEncVideoBitrate = pC->uiVideoBitrate;
53877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AudioEncParams.Bitrate = pC->uiAudioBitrate;
53887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4MCS_WITH_FAST_OPEN
53907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
53917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Remake the open if it was done in fast mode */
53927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_TRUE == pC->bFileOpenedInFastMode )
53947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
53957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Close the file opened in fast mode */
53967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4MCS_intCleanUp_ReadersDecoders(pC);
53977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
53987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4MCS_kState_CREATED;
53997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Reopen it in normal mode */
54017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4MCS_open(pContext, pC->pInputFile, pC->InputFileType,
54027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pOutputFile, pC->pTemporaryFile);
54037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( err != M4NO_ERROR )
54057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
54067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
54077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_checkParamsAndStart : M4MCS_Open returns 0x%x", err);
54087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
54097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
54107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
54117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* M4MCS_WITH_FAST_OPEN */
54137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->State = M4MCS_kState_READY;
54157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
54177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
54187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
54207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
54217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intStepSet(M4MCS_InternalContext* pC)
54227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
54237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
54247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intStepSet( M4MCS_InternalContext *pC )
54257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
54267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
54277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_Header *encHeader;
54287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
54307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Prepare the video decoder */
54317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_intPrepareVideoDecoder(pC);
54327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
54347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
54357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
54367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intStepSet(): M4MCS_intPrepareVideoDecoder() returns 0x%x",
54377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
54387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
54397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
54407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->InputFileProperties.VideoStreamType == M4VIDEOEDITING_kH264)
54427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->EncodingVideoFormat == M4ENCODER_kNULL) )
54437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
54447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->bH264Trim = M4OSA_TRUE;
54457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
54467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
54487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Prepare the video encoder */
54497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_intPrepareVideoEncoder(pC);
54507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
54527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
54537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
54547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intStepSet(): M4MCS_intPrepareVideoEncoder() returns 0x%x",
54557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
54567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
54577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
54587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->uiBeginCutTime != 0)
54607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->InputFileProperties.VideoStreamType == M4VIDEOEDITING_kH264)
54617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->EncodingVideoFormat == M4ENCODER_kNULL) )
54627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
54637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pVideoEncoderGlobalFcts->pFctSetOption(pC->pViEncCtxt,
54657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4ENCODER_kOptionID_H264ProcessNALUContext,
54667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_DataOption)pC->m_pInstance);
54677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( err != M4NO_ERROR )
54697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
54707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1("M4MCS_intStetSet :pFctSetOption failed  (err 0x%x)",
54717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
54727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
54737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
54747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pVideoEncoderGlobalFcts->pFctSetOption(pC->pViEncCtxt,
54767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4ENCODER_kOptionID_SetH264ProcessNALUfctsPtr,
54777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_DataOption) &H264MCS_ProcessEncodedNALU);
54787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( err != M4NO_ERROR )
54807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
54817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1("M4MCS_intStetSet :pFctSetOption failed  (err 0x%x)",
54827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
54837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
54847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
54857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pVideoEncoderGlobalFcts->pFctGetOption(pC->pViEncCtxt,
54877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4ENCODER_kOptionID_EncoderHeader,
54887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_DataOption) &encHeader);
54897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
54907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( M4NO_ERROR != err) || (M4OSA_NULL == encHeader->pBuf) )
54917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
54927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
54937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_close: failed to get the encoder header (err 0x%x)",
54947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
54957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< no return here, we still have stuff to deallocate after close, even if it fails.*/
54967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
54977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
54987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
54997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            // Handle DSI first bits
55007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define SPS_START_POS 6
55017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
55027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_pInstance->m_encoderSPSSize =
55037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ( encHeader->pBuf[SPS_START_POS] << 8)
55047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                + encHeader->pBuf[SPS_START_POS + 1];
55057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_pInstance->m_pEncoderSPS =
55067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt8 *)(encHeader->pBuf) + SPS_START_POS + 2;
55077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
55087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_pInstance->m_encoderPPSSize =
55097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ( encHeader->pBuf[SPS_START_POS + 3
55107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                + pC->m_pInstance->m_encoderSPSSize] << 8)
55117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                + encHeader->pBuf[SPS_START_POS + 4
55127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                + pC->m_pInstance->m_encoderSPSSize];
55137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_pInstance->m_pEncoderPPS = (M4OSA_UInt8 *)encHeader->pBuf + SPS_START_POS + 5
55147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                + pC->m_pInstance->m_encoderSPSSize;
55157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
55167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Check the DSI integrity */
55177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( encHeader->Size != (pC->m_pInstance->m_encoderSPSSize
55187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                + pC->m_pInstance->m_encoderPPSSize + 5 + SPS_START_POS) )
55197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
55207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_3(
55217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "!!! M4MCS_intStepSet ERROR : invalid SPS / PPS %d %d %d",
55227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    encHeader->Size, pC->m_pInstance->m_encoderSPSSize,
55237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->m_pInstance->m_encoderPPSSize);
55247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_PARAMETER;
55257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
55267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
55277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
55287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
55297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
55307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Prepare audio processing */
55317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_intPrepareAudioProcessing(pC);
55327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
55337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
55347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
55357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
55367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intStepSet(): M4MCS_intPrepareAudioProcessing() returns 0x%x",
55377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
55387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
55397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
55407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
55417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
55427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Prepare the writer */
55437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_intPrepareWriter(pC);
55447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
55457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
55467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
55477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
55487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intStepSet(): M4MCS_intPrepareWriter() returns 0x%x", err);
55497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
55507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
55517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
55527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
55537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Jump the audio stream to the begin cut time (all AUs are RAP)
55547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Must be done after the 3gpp writer init, because it may write the first
55557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * audio AU in some cases */
55567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_intPrepareAudioBeginCut(pC);
55577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
55587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
55597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
55607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
55617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intStepSet(): M4MCS_intPrepareAudioBeginCut() returns 0x%x",
55627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
55637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
55647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
55657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
55667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
55677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Update state automaton */
55687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( 0 == pC->uiBeginCutTime )
55697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
55707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->dViDecStartingCts = 0.0;
55717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
55727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * No begin cut, do the encoding */
55737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4MCS_kState_PROCESSING;
55747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
55757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
55767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
55777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
55787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Remember that we must start the decode/encode process at the begin cut time */
55797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->dViDecStartingCts = (M4OSA_Double)pC->uiBeginCutTime;
55807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
55817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
55827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Jumping */
55837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4MCS_kState_BEGINVIDEOJUMP;
55847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
55857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
55867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
55877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
55887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_intStepSet(): returning M4NO_ERROR");
55897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
55907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
55917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
55927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
55937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
55947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intPrepareVideoDecoder(M4MCS_InternalContext* pC);
55957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Prepare the video decoder.
55967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC          (IN) MCS private context
55977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR  No error
55987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4MCS_ERR_H263_PROFILE_NOT_SUPPORTED
55997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   Any error returned by an underlaying module
56007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
56017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
56027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intPrepareVideoDecoder( M4MCS_InternalContext *pC )
56037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
56047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
56057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Void *decoderUserData;
56067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4DECODER_OutputFilter FilterOption;
56077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->novideo )
56097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
56107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
56127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Create the decoder, if it has not been created yet (to get video properties for example) */
56137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pC->pViDecCtxt )
56147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
56157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS
56167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        decoderUserData = pC->m_pCurrentVideoDecoderUserData;
56187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else
56207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        decoderUserData = M4OSA_NULL;
56227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* M4VSS_ENABLE_EXTERNAL_DECODERS ? */
56247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pVideoDecoder->m_pFctCreate(&pC->pViDecCtxt,
5626b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang            &pC->pReaderVideoStream->m_basicProperties, pC->m_pReader,
5627b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang            pC->m_pReaderDataIt, &pC->ReaderVideoAU, decoderUserData);
56287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( (M4OSA_UInt32)(M4ERR_DECODER_H263_PROFILE_NOT_SUPPORTED) == err )
56307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
56317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
56327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Our decoder is not compatible with H263 profile other than 0.
56337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * So it returns this internal error code.
56347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * We translate it to our own error code */
56357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("M4MCS_intPrepareVideoDecoder:\
56367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                           returning M4MCS_ERR_H263_PROFILE_NOT_SUPPORTED");
56377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4MCS_ERR_H263_PROFILE_NOT_SUPPORTED;
56387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
56397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else if( M4NO_ERROR != err )
56407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
56417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1("M4MCS_intPrepareVideoDecoder:\
56427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                           m_pVideoDecoder->m_pFctCreate returns 0x%x", err);
56437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
56447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
56457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4VIDEOEDITING_kH264 == pC->InputFileProperties.VideoStreamType )
56477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
56487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            FilterOption.m_pFilterFunction =
56497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_Void *) &M4VIFI_ResizeBilinearYUV420toYUV420;
56507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            FilterOption.m_pFilterUserData = M4OSA_NULL;
56517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->m_pVideoDecoder->m_pFctSetOption(pC->pViDecCtxt,
56527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4DECODER_kOptionID_OutputFilter,
56537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_DataOption) &FilterOption);
56547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
56567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
56577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1("M4MCS_intPrepareVideoDecoder:\
56587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                               m_pVideoDecoder->m_pFctSetOption returns 0x%x", err);
56597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
56607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
56617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
56627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
56637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
56657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
56667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_intPrepareVideoDecoder(): returning M4NO_ERROR");
56677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
56687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
56697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
56717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
56727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intPrepareVideoEncoder(M4MCS_InternalContext* pC);
56737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Prepare the video encoder.
56747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC          (IN) MCS private context
56757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR  No error
56767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   Any error returned by an underlaying module
56777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
56787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
56797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intPrepareVideoEncoder( M4MCS_InternalContext *pC )
56807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
56817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
56827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_AdvancedParams EncParams; /**< Encoder advanced parameters */
56837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_Params EncParams1;
56847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Double dFrameRate;            /**< tmp variable */
56857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->novideo )
56877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
56887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->EncodingVideoFormat == M4ENCODER_kNULL )
56907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
56917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Approximative cts increment */
56927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->dCtsIncrement = 1000.0 / pC->pReaderVideoStream->m_averageFrameRate;
56937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
56947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->uiBeginCutTime == 0 )
56957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
56967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE3_0(
56977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareVideoEncoder(): Null encoding, do nothing.");
56987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4NO_ERROR;
56997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
57007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
57017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
57027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE3_0(
57037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareVideoEncoder(): Null encoding, I-frame defaults.");
57047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Set useful parameters to encode the first I-frame */
57067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.InputFormat = M4ENCODER_kIYUV420;
57070a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            EncParams.videoProfile = pC->encodingVideoProfile;
57080a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            EncParams.videoLevel= pC->encodingVideoLevel;
57097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            switch( pC->InputFileProperties.VideoStreamType )
57117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
57127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kH263:
57137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    EncParams.Format = M4ENCODER_kH263;
57147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
57157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kMPEG4:
57177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    EncParams.Format = M4ENCODER_kMPEG4;
57187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
57197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kH264:
57217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    EncParams.Format = M4ENCODER_kH264;
57227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
57237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                default:
57257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1("M4MCS_intPrepareVideoEncoder: unknown encoding video format\
57267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                   (%d), returning M4MCS_WAR_MEDIATYPE_NOT_SUPPORTED",
57277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                   pC->InputFileProperties.VideoStreamType);
57287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4MCS_WAR_MEDIATYPE_NOT_SUPPORTED;
57297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
57307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.FrameWidth = pC->EncodingWidth;
57327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.FrameHeight = pC->EncodingHeight;
57337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.Bitrate = pC->uiEncVideoBitrate;
57347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.bInternalRegulation =
57357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_FALSE; /* do not constrain the I-frame */
57367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.FrameRate = pC->EncodingVideoFramerate;
57377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Other encoding settings (quite all dummy...) */
57397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.uiHorizontalSearchRange = 0;    /* use default */
57407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.uiVerticalSearchRange = 0;      /* use default */
57417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.bErrorResilience = M4OSA_FALSE; /* no error resilience */
57427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.uiIVopPeriod = 0;               /* use default */
57437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.uiMotionEstimationTools =
57447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                0; /* M4V_MOTION_EST_TOOLS_ALL */
57457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.bAcPrediction = M4OSA_TRUE;     /* use AC prediction */
57467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.uiStartingQuantizerValue = 5;   /* initial QP = 5 */
57477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.bDataPartitioning =
57487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_FALSE; /* no data partitioning */
57497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Rate factor */
57517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.uiTimeScale = pC->InputFileProperties.uiVideoTimeScale;
57527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            EncParams.uiRateFactor = 1;
57537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
57547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
57557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
57567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
57577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE3_0(
57587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareVideoEncoder(): Normal encoding, set full config.");
57597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
57617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Set encoder shell parameters according to MCS settings */
57627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams.Format = pC->EncodingVideoFormat;
57637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams.InputFormat = M4ENCODER_kIYUV420;
57640a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        EncParams.videoProfile = pC->encodingVideoProfile;
57650a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        EncParams.videoLevel= pC->encodingVideoLevel;
57667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
57687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Video frame size */
57697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams.FrameWidth = pC->EncodingWidth;
57707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams.FrameHeight = pC->EncodingHeight;
57717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
57737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Video bitrate has been previously computed */
57747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams.Bitrate = pC->uiEncVideoBitrate;
57757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
57777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * MCS use the "true" core internal bitrate regulation */
57787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams.bInternalRegulation = M4OSA_TRUE;
57797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
57817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Other encoder settings */
57820a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury
57830a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        EncParams.uiHorizontalSearchRange = 0;    /* use default */
57840a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        EncParams.uiVerticalSearchRange = 0;      /* use default */
57850a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        EncParams.bErrorResilience = M4OSA_FALSE; /* no error resilience */
57860a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        EncParams.uiIVopPeriod = 0;               /* use default */
57870a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        EncParams.uiMotionEstimationTools =
57880a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            0; /* M4V_MOTION_EST_TOOLS_ALL */
57890a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        EncParams.bAcPrediction = M4OSA_TRUE;     /* use AC prediction */
57900a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        EncParams.uiStartingQuantizerValue = 10;  /* initial QP = 10 */
57910a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        EncParams.bDataPartitioning =
57920a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            M4OSA_FALSE; /* no data partitioning */
57930a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury
57947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
57957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
57967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Video encoder frame rate and rate factor */
57977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams.FrameRate = pC->EncodingVideoFramerate;
57987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams.uiTimeScale = pC->outputVideoTimescale;
57997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pC->EncodingVideoFramerate )
58017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
58027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k5_FPS:
58037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                dFrameRate = 5.0;
58047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
58057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k7_5_FPS:
58077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                dFrameRate = 7.5;
58087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
58097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k10_FPS:
58117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                dFrameRate = 10.0;
58127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
58137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k12_5_FPS:
58157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                dFrameRate = 12.5;
58167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
58177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k15_FPS:
58197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                dFrameRate = 15.0;
58207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
58217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k20_FPS: /**< MPEG-4 only */
58237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                dFrameRate = 20.0;
58247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
58257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k25_FPS: /**< MPEG-4 only */
58277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                dFrameRate = 25.0;
58287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
58297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k30_FPS:
58317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                dFrameRate = 30.0;
58327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
58337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            default:
58357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
58367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intPrepareVideoEncoder: unknown encoding video frame rate\
58377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (0x%x), returning M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FRAME_RATE",
58387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->EncodingVideoFramerate);
58397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FRAME_RATE;
58407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
58417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
58437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Compute the number of milliseconds between two frames */
58447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4ENCODER_kH263 == EncParams.Format )
58457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
58467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->dCtsIncrement = 1001.0 / dFrameRate;
58477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
58487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else /**< MPEG4 or H.264 */
58497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
58507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->dCtsIncrement = 1000.0 / dFrameRate;
58517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
58527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
58537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
585595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury     * Limit the video bitrate according to encoder profile
585695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury     * and level */
585795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    err = M4MCS_intLimitBitratePerCodecProfileLevel(&EncParams);
585895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    if (M4NO_ERROR != err) {
585995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        M4OSA_TRACE1_1(
586095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            "M4MCS_intPrepareVideoEncoder: limit bitrate returned err \
586195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury             0x%x", err);
586295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        return err;
586395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    }
586495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
586595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    /**
58667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Create video encoder */
58677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->pVideoEncoderGlobalFcts->pFctInit(&pC->pViEncCtxt,
58687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pWriterDataFcts, \
58697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4MCS_intApplyVPP, pC, pC->pCurrentVideoEncoderExternalAPI, \
58707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pCurrentVideoEncoderUserData);
58717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**< We put the MCS context in place of the VPP context */
58737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
58747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
58757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
58767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareVideoEncoder: EncoderInt->pFctInit returns 0x%x",
58777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
58787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
58797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
58807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->encoderState = M4MCS_kEncoderClosed;
58827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
58837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_TRUE == pC->bH264Trim )
58847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //if((M4ENCODER_kNULL == pC->EncodingVideoFormat)
58857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //    && (M4VIDEOEDITING_kH264 == pC->InputFileProperties.VideoStreamType))
58867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
58877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams1.InputFormat = EncParams.InputFormat;
58887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //EncParams1.InputFrameWidth = EncParams.InputFrameWidth;
58897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //EncParams1.InputFrameHeight = EncParams.InputFrameHeight;
58907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams1.FrameWidth = EncParams.FrameWidth;
58917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams1.FrameHeight = EncParams.FrameHeight;
58920a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        EncParams1.videoProfile= EncParams.videoProfile;
58930a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        EncParams1.videoLevel= EncParams.videoLevel;
58947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams1.Bitrate = EncParams.Bitrate;
58957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams1.FrameRate = EncParams.FrameRate;
58967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        EncParams1.Format = M4ENCODER_kH264; //EncParams.Format;
58970a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        M4OSA_TRACE1_2("mcs encoder open profile :%d, level %d",
58980a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            EncParams1.videoProfile, EncParams1.videoLevel);
58997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pVideoEncoderGlobalFcts->pFctOpen(pC->pViEncCtxt,
59007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pC->WriterVideoAU, &EncParams1);
59017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
59027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
59037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
59040a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        M4OSA_TRACE1_2("mcs encoder open Adv profile :%d, level %d",
59050a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            EncParams.videoProfile, EncParams.videoLevel);
59067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pVideoEncoderGlobalFcts->pFctOpen(pC->pViEncCtxt,
59077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pC->WriterVideoAU, &EncParams);
59087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
59097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
59117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
59127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
59137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareVideoEncoder: EncoderInt->pFctOpen returns 0x%x",
59147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
59157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
59167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
59177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->encoderState = M4MCS_kEncoderStopped;
59197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pVideoEncoderGlobalFcts->pFctStart )
59217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
59227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pVideoEncoderGlobalFcts->pFctStart(pC->pViEncCtxt);
59237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
59257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
59267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
59277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareVideoEncoder: EncoderInt->pFctStart returns 0x%x",
59287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
59297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
59307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
59317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
59327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->encoderState = M4MCS_kEncoderRunning;
59347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /******************************/
59367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Video resize management    */
59377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /******************************/
59387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
59397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Compare video input size and video output size to check if resize is needed */
59407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( (M4OSA_UInt32)EncParams.FrameWidth
59417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        != pC->pReaderVideoStream->m_videoWidth)
59427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || ((M4OSA_UInt32)EncParams.FrameHeight
59437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        != pC->pReaderVideoStream->m_videoHeight) )
59447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
59457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
59467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Allocate the intermediate video plane that will receive the decoded image before
59477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         resizing */
59487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame =
5949694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(3 * sizeof(M4VIFI_ImagePlane),
59507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS, (M4OSA_Char *)"m_pPreResizeFrame");
59517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL == pC->pPreResizeFrame )
59537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
59547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("M4MCS_intPrepareVideoEncoder():\
59557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                           unable to allocate m_pPreResizeFrame, returning M4ERR_ALLOC");
59567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
59577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
59587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[0].pac_data = M4OSA_NULL;
59607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[1].pac_data = M4OSA_NULL;
59617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[2].pac_data = M4OSA_NULL;
59627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
59647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Allocate the Y plane */
59657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[0].u_topleft = 0;
59667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[0].u_width = pC->pReaderVideoStream->
59677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            m_videoWidth; /**< input width */
59687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[0].u_height = pC->pReaderVideoStream->
59697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            m_videoHeight; /**< input height */
59707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[0].u_stride = pC->
59717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPreResizeFrame[0].u_width; /**< simple case: stride equals width */
59727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[0].pac_data =
5974694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(pC->pPreResizeFrame[0].u_stride \
59757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pC->pPreResizeFrame[0].u_height, M4MCS,
59767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Char *)"m_pPreResizeFrame[0].pac_data");
59777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL == pC->pPreResizeFrame[0].pac_data )
59797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
59807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
59817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareVideoEncoder():\
59827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     unable to allocate m_pPreResizeFrame[0].pac_data, returning M4ERR_ALLOC");
59837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
59847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
59857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
59877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Allocate the U plane */
59887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[1].u_topleft = 0;
59897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[1].u_width = pC->pPreResizeFrame[0].u_width
59907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            >> 1; /**< U width is half the Y width */
59917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[1].u_height = pC->pPreResizeFrame[0].u_height
59927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            >> 1; /**< U height is half the Y height */
59937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[1].u_stride = pC->
59947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPreResizeFrame[1].u_width; /**< simple case: stride equals width */
59957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
59967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[1].pac_data =
5997694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(pC->pPreResizeFrame[1].u_stride \
59987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pC->pPreResizeFrame[1].u_height, M4MCS,
59997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Char *)"m_pPreResizeFrame[1].pac_data");
60007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL == pC->pPreResizeFrame[1].pac_data )
60027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
60037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
60047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareVideoEncoder():\
60057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 unable to allocate m_pPreResizeFrame[1].pac_data, returning M4ERR_ALLOC");
60067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
60077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
60087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
60107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Allocate the V plane */
60117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[2].u_topleft = 0;
60127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[2].u_width = pC->
60137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPreResizeFrame[1].u_width; /**< V width equals U width */
60147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[2].u_height = pC->
60157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPreResizeFrame[1].u_height; /**< V height equals U height */
60167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[2].u_stride = pC->
60177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pPreResizeFrame[2].u_width; /**< simple case: stride equals width */
60187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPreResizeFrame[2].pac_data =
6020694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(pC->pPreResizeFrame[2].u_stride \
60217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pC->pPreResizeFrame[2].u_height, M4MCS,
60227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Char *)"m_pPreResizeFrame[1].pac_data");
60237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL == pC->pPreResizeFrame[2].pac_data )
60257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
60267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0(
60277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareVideoEncoder():\
60287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 unable to allocate m_pPreResizeFrame[2].pac_data, returning M4ERR_ALLOC");
60297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
60307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
60317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
60327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
60347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
60357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_intPrepareVideoEncoder(): returning M4NO_ERROR");
60367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
60377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
60387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
60407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
60417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intPrepareAudioProcessing(M4MCS_InternalContext* pC);
60427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Prepare the AAC decoder, the SRC and the AMR-NB encoder and the MP3 encoder.
60437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC          (IN) MCS private context
60447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR  No error
60457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   Any error returned by an underlaying module
60467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
60477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
60487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intPrepareAudioProcessing( M4MCS_InternalContext *pC )
60497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
60507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
60517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SSRC_ReturnStatus_en
60537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ReturnStatus; /* Function return status                       */
60547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LVM_INT16 NrSamplesMin =
60557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        0; /* Minimal number of samples on the input or on the output */
60567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LVM_INT32 ScratchSize; /* The size of the scratch memory               */
60577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LVM_INT16
60587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pInputInScratch; /* Pointer to input in the scratch buffer       */
60597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    LVM_INT16
60607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pOutputInScratch; /* Pointer to the output in the scratch buffer  */
60617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    SSRC_Params_t ssrcParams;          /* Memory for init parameters                    */
60627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef MCS_DUMP_PCM_TO_FILE
60647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    file_au_reader = fopen("mcs_ReaderOutput.raw", "wb");
60667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    file_pcm_decoder = fopen("mcs_DecoderOutput.pcm", "wb");
60677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    file_pcm_encoder = fopen("mcs_EncoderInput.pcm", "wb");
60687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
60707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->noaudio )
60727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
60737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->AudioEncParams.Format == M4ENCODER_kAudioNULL )
60757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
60767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE3_0(
60777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareAudioProcessing(): Null encoding, do nothing.");
60787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
60797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
60807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ________________________________ */
60827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|                                |*/
60837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*| Create and "start" the decoder |*/
60847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|________________________________|*/
60857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pC->m_pAudioDecoder )
60877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
60887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
60897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareAudioProcessing(): Fails to initiate the audio decoder.");
60907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_ERR_AUDIO_CONVERSION_FAILED;
60917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
60927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pC->pAudioDecCtxt )
60947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
60957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pAudioDecoder->m_pFctCreateAudioDec(&pC->pAudioDecCtxt,
60967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderAudioStream, pC->m_pCurrentAudioDecoderUserData);
60977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
60987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
60997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
61007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
61017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareVideoDecoder: m_pAudioDecoder->m_pFctCreateAudioDec returns 0x%x",
61027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
61037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
61047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
61057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
61067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
61077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4VIDEOEDITING_kAMR_NB == pC->InputFileProperties.AudioStreamType ) {
61087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* AMR DECODER CONFIGURATION */
61097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
61107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* nothing specific to do */
61117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
61127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( M4VIDEOEDITING_kEVRC == pC->InputFileProperties.AudioStreamType ) {
61137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* EVRC DECODER CONFIGURATION */
61147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
61157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* nothing specific to do */
61167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
61177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( M4VIDEOEDITING_kMP3 == pC->InputFileProperties.AudioStreamType ) {
61187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* MP3 DECODER CONFIGURATION */
61197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
61207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* nothing specific to do */
61217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
61227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
61237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
61247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* AAC DECODER CONFIGURATION */
61257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4_AacDecoderConfig AacDecParam;
61267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
61277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        AacDecParam.m_AACDecoderProfile = AAC_kAAC;
61287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        AacDecParam.m_DownSamplingMode = AAC_kDS_OFF;
61297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
61307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->AudioEncParams.Format == M4ENCODER_kAMRNB )
61317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
61327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            AacDecParam.m_OutputMode = AAC_kMono;
61337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
61347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
61357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
61367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* For this version, we encode only in AAC */
61377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4ENCODER_kMono == pC->AudioEncParams.ChannelNum )
61387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
61397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                AacDecParam.m_OutputMode = AAC_kMono;
61407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
61417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
61427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
61437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                AacDecParam.m_OutputMode = AAC_kStereo;
61447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
61457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
61467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
61477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->m_pAudioDecoder->m_pFctSetOptionAudioDec(pC->pAudioDecCtxt,
61487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4AD_kOptionID_UserParam, (M4OSA_DataOption) &AacDecParam);
61497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
61507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6151bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    pC->m_pAudioDecoder->m_pFctSetOptionAudioDec(pC->pAudioDecCtxt,
6152bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury           M4AD_kOptionID_3gpReaderInterface, (M4OSA_DataOption) pC->m_pReaderDataIt);
6153bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
6154bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    pC->m_pAudioDecoder->m_pFctSetOptionAudioDec(pC->pAudioDecCtxt,
6155bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury           M4AD_kOptionID_AudioAU, (M4OSA_DataOption) &pC->ReaderAudioAU);
6156bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
61577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_pAudioDecoder->m_pFctStartAudioDec != M4OSA_NULL )
61587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
61597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Not implemented in all decoders */
61607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pAudioDecoder->m_pFctStartAudioDec(pC->pAudioDecCtxt);
61617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
61627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
61637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
61647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
61657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareVideoDecoder: m_pAudioDecoder->m_pFctStartAudioDec returns 0x%x",
61667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
61677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
61687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
61697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
61707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
61717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
61727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Allocate output buffer for the audio decoder */
61737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiDecodedPcmSize =
61747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pReaderAudioStream->m_byteFrameLength
61757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * pC->pReaderAudioStream->m_byteSampleSize
61767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * pC->pReaderAudioStream->m_nbChannels;
61777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
61787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->InputFileProperties.uiDecodedPcmSize > 0 )
61797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
61807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->AudioDecBufferOut.m_bufferSize =
61817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.uiDecodedPcmSize;
61827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->AudioDecBufferOut.m_dataAddress =
6183694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pC->AudioDecBufferOut.m_bufferSize \
61847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *sizeof(short), M4MCS, (M4OSA_Char *)"AudioDecBufferOut.m_bufferSize");
61857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
61867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
61877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pC->AudioDecBufferOut.m_dataAddress )
61887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
61897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
61907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareVideoDecoder():\
61917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             unable to allocate AudioDecBufferOut.m_dataAddress, returning M4ERR_ALLOC");
61927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_ALLOC;
61937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
61947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
61957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* _________________________ */
61967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|                         |*/
61977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*| Set the SSRC parameters |*/
61987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|_________________________|*/
61997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pC->pReaderAudioStream->m_samplingFrequency )
62017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
62027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 8000:
62037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.SSRC_Fs_In = LVM_FS_8000;
62047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
62057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 11025:
62077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.SSRC_Fs_In = LVM_FS_11025;
62087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
62097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 12000:
62117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.SSRC_Fs_In = LVM_FS_12000;
62127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
62137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 16000:
62157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.SSRC_Fs_In = LVM_FS_16000;
62167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
62177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 22050:
62197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.SSRC_Fs_In = LVM_FS_22050;
62207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
62217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 24000:
62237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.SSRC_Fs_In = LVM_FS_24000;
62247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
62257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 32000:
62277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.SSRC_Fs_In = LVM_FS_32000;
62287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
62297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 44100:
62317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.SSRC_Fs_In = LVM_FS_44100;
62327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
62337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 48000:
62357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.SSRC_Fs_In = LVM_FS_48000;
62367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
62377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
62397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
62407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareVideoDecoder: invalid input AAC sampling frequency (%d Hz),\
62417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 returning M4MCS_ERR_INVALID_AAC_SAMPLING_FREQUENCY",
62427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pReaderAudioStream->m_samplingFrequency);
62437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4MCS_ERR_INVALID_AAC_SAMPLING_FREQUENCY;
62447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
62457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( 1 == pC->pReaderAudioStream->m_nbChannels )
62477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
62487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ssrcParams.SSRC_NrOfChannels = LVM_MONO;
62497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
62507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
62517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
62527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ssrcParams.SSRC_NrOfChannels = LVM_STEREO;
62537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
62547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*FlB 26.02.2009: add mp3 as output format*/
62567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->AudioEncParams.Format == M4ENCODER_kAAC
62577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || pC->AudioEncParams.Format == M4ENCODER_kMP3 )
62587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
62597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pC->AudioEncParams.Frequency )
62607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
62617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k8000Hz:
62627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_8000;
62637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
62647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k11025Hz:
62667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_11025;
62677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
62687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k12000Hz:
62707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_12000;
62717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
62727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k16000Hz:
62747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_16000;
62757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
62767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k22050Hz:
62787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_22050;
62797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
62807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k24000Hz:
62827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_24000;
62837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
62847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k32000Hz:
62867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_32000;
62877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
62887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k44100Hz:
62907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_44100;
62917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
62927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_k48000Hz:
62947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ssrcParams.SSRC_Fs_Out = LVM_FS_48000;
62957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
62967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
62977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            default:
62987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
62997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intPrepareAudioProcessing: invalid output AAC sampling frequency \
63007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (%d Hz), returning M4MCS_ERR_INVALID_AAC_SAMPLING_FREQUENCY",
63017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioEncParams.Frequency);
63027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4MCS_ERR_INVALID_AAC_SAMPLING_FREQUENCY;
63037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
63047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
63057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
63067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
63077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
63087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ssrcParams.SSRC_Fs_Out = LVM_FS_8000;
63097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
63107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    ReturnStatus = 0;
63147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( ssrcParams.SSRC_Fs_In )
63167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
63177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_8000:
63187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = 320;
63197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_11025:
63227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = 441;
63237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_12000:
63267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = 480;
63277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_16000:
63307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = 640;
63317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_22050:
63347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = 882;
63357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_24000:
63387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = 960;
63397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_32000:
63427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = 1280;
63437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_44100:
63467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = 1764;
63477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_48000:
63507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesIn = 1920;
63517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
63547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ReturnStatus = -1;
63557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
63577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( ssrcParams.SSRC_Fs_Out )
63597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
63607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_8000:
63617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut = 320;
63627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_11025:
63657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut = 441;
63667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_12000:
63697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut = 480;
63707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_16000:
63737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut = 640;
63747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_22050:
63777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut = 882;
63787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_24000:
63817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut = 960;
63827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_32000:
63857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut = 1280;
63867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_44100:
63897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut = 1764;
63907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case LVM_FS_48000:
63937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcParams.NrSamplesOut = 1920;
63947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
63967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
63977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ReturnStatus = -1;
63987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
63997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
64007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ReturnStatus != SSRC_OK )
64047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
64057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
64067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareAudioProcessing:\
64077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             Error code %d returned by the SSRC_GetNrSamples function",
64087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ReturnStatus);
64097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_ERR_AUDIO_CONVERSION_FAILED;
64107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
64117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    NrSamplesMin =
64137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (LVM_INT16)((ssrcParams.NrSamplesIn > ssrcParams.NrSamplesOut)
64147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ? ssrcParams.NrSamplesOut : ssrcParams.NrSamplesIn);
64157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while( NrSamplesMin < M4MCS_SSRC_MINBLOCKSIZE )
64177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    { /* Don't take blocks smaller that the minimal block size */
64187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ssrcParams.NrSamplesIn = (LVM_INT16)(ssrcParams.NrSamplesIn << 1);
64197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ssrcParams.NrSamplesOut = (LVM_INT16)(ssrcParams.NrSamplesOut << 1);
64207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        NrSamplesMin = (LVM_INT16)(NrSamplesMin << 1);
64217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
64227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->iSsrcNbSamplIn = (LVM_INT16)(
64257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ssrcParams.
64267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        NrSamplesIn); /* multiplication by NrOfChannels is done below */
64277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->iSsrcNbSamplOut = (LVM_INT16)(ssrcParams.NrSamplesOut);
64287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
64307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Allocate buffer for the input of the SSRC */
64317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pSsrcBufferIn =
6432694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pC->iSsrcNbSamplIn * sizeof(short) \
64337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pC->pReaderAudioStream->m_nbChannels, M4MCS,
64347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Char *)"pSsrcBufferIn");
64357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pC->pSsrcBufferIn )
64377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
64387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
64397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareVideoDecoder():\
64407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             unable to allocate pSsrcBufferIn, returning M4ERR_ALLOC");
64417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_ALLOC;
64427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
64437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInSsrcBufferIn = (M4OSA_MemAddr8)pC->pSsrcBufferIn;
64447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
64467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Allocate buffer for the output of the SSRC */
64477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pSsrcBufferOut =
6448694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pC->iSsrcNbSamplOut * sizeof(short) \
64497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pC->pReaderAudioStream->m_nbChannels, M4MCS,
64507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Char *)"pSsrcBufferOut");
64517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL == pC->pSsrcBufferOut )
64537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
64547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0(
64557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareVideoDecoder():\
64567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             unable to allocate pSsrcBufferOut, returning M4ERR_ALLOC");
64577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_ALLOC;
64587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
64597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6461100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru    pC->pLVAudioResampler = LVAudioResamplerCreate(
64627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        16, /*gInputParams.lvBTChannelCount*/
64637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Int16)pC->InputFileProperties.uiNbChannels/*ssrcParams.SSRC_NrOfChannels*/,
6464100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru        (M4OSA_Int32)(pC->AudioEncParams.Frequency)/*ssrcParams.SSRC_Fs_Out*/, 1);
6465100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru
6466100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru     if( M4OSA_NULL == pC->pLVAudioResampler)
6467100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru     {
6468100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru         return M4ERR_ALLOC;
6469100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru     }
6470100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru
6471100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru    LVAudiosetSampleRate(pC->pLVAudioResampler,
64727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*gInputParams.lvInSampleRate*/
64737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*pC->pAddedClipCtxt->pSettings->ClipProperties.uiSamplingFrequency*/
64747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiSamplingFrequency/*ssrcParams.SSRC_Fs_In*/);
64757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
6476100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru    LVAudiosetVolume(pC->pLVAudioResampler, (M4OSA_Int16)(0x1000 /* 0x7fff */),
64777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Int16)(0x1000/*0x7fff*/));
64787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ________________________ */
64817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|                        |*/
64827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*| Init the audio encoder |*/
64837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|________________________|*/
64847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Initialise the audio encoder */
64867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->pAudioEncoderGlobalFcts->pFctInit(&pC->pAudioEncCtxt,
64887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pCurrentAudioEncoderUserData);
64897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
64917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
64927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
64937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareAudioProcessing: pAudioEncoderGlobalFcts->pFctInit returns 0x%x",
64947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
64957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
64967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
64977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
64987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Open the audio encoder */
64997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->pAudioEncoderGlobalFcts->pFctOpen(pC->pAudioEncCtxt,
65007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        &pC->AudioEncParams, &pC->pAudioEncDSI,
65017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_NULL /* no grabbing */);
65027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
65047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
65057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
65067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareAudioProcessing: pAudioEncoderGlobalFcts->pFctOpen returns 0x%x",
65077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
65087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
65097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
65107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Allocate the input buffer for the audio encoder */
65127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( pC->AudioEncParams.Format )
65137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
65147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_kAMRNB:
65157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->audioEncoderGranularity = M4MCS_PCM_AMR_GRANULARITY_SAMPLES;
65167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
65177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_kAAC:
65197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->audioEncoderGranularity = M4MCS_PCM_AAC_GRANULARITY_SAMPLES;
65207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
65217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*FlB 26.02.2009: add mp3 as output format*/
65237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case M4ENCODER_kMP3:
65247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->audioEncoderGranularity = M4MCS_PCM_MP3_GRANULARITY_SAMPLES;
65257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
65267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         default:
65287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         break;
65297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
65307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4ENCODER_kMono == pC->AudioEncParams.ChannelNum )
65327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->audioEncoderGranularity *= sizeof(short);
65337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
65347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->audioEncoderGranularity *= sizeof(short) * 2;
65357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInAudioEncoderBuffer = M4OSA_NULL;
65377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pAudioEncoderBuffer =
6538694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pC->audioEncoderGranularity, M4MCS,
65397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Char *)"pC->pAudioEncoderBuffer");
65407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
65427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
65437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_intPrepareAudioProcessing(): returning M4NO_ERROR");
65447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
65457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
65467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
65487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
65497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intPrepareWriter(M4MCS_InternalContext* pC);
65507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Prepare the writer.
65517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC          (IN) MCS private context
65527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR  No error
65537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   Any error returned by an underlaying module
65547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
65557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
65567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intPrepareWriter( M4MCS_InternalContext *pC )
65577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
65587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
65597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 uiVersion; /**< To write component version in 3gp writer */
65607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_MemAddr8 pDSI = M4OSA_NULL; /**< To create the Decoder Specific Info */
65617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4SYS_StreamIDValue optionValue; /**< For the setoption calls */
65627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 TargetedFileSize;
65637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Bool bMULPPSSPS = M4OSA_FALSE;
65647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
65667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Init the writer */
65677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->pWriterGlobalFcts->pFctOpen(&pC->pWriterContext, pC->pOutputFile,
65687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pOsaFileWritPtr, pC->pTemporaryFile, pC->pOsaFileReadPtr);
65697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
65717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
65727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
65737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareWriter: pWriterGlobalFcts->pFctOpen returns 0x%x",
65747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
65757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
65767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
65777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
65797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Link to the writer context in the writer interface */
65807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pWriterDataFcts->pWriterContext = pC->pWriterContext;
65817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
65837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Set the product description string in the written file */
65847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->pWriterGlobalFcts->pFctSetOption(pC->pWriterContext,
65857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4WRITER_kEmbeddedString, (M4OSA_DataOption)"NXP-SW : MCS    ");
65867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( M4NO_ERROR != err) && (( (M4OSA_UInt32)M4ERR_BAD_OPTION_ID)
65887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        != err) ) /* this option may not be implemented by some writers */
65897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
65907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
65917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareWriter:\
65927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             pWriterGlobalFcts->pFctSetOption(M4WRITER_kEmbeddedString) returns 0x%x",
65937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
65947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
65957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
65967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
65977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
65987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Set the product version in the written file */
65997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uiVersion =
66007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VIDEOEDITING_VERSION_MAJOR * 100 + M4VIDEOEDITING_VERSION_MINOR * 10
66017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        + M4VIDEOEDITING_VERSION_REVISION;
66027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->pWriterGlobalFcts->pFctSetOption(pC->pWriterContext,
66037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4WRITER_kEmbeddedVersion, (M4OSA_DataOption) &uiVersion);
66047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
66057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( M4NO_ERROR != err) && (( (M4OSA_UInt32)M4ERR_BAD_OPTION_ID)
66067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        != err) ) /* this option may not be implemented by some writers */
66077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
66087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
66097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareWriter: \
66107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pWriterGlobalFcts->pFctSetOption(M4WRITER_kEmbeddedVersion) returns 0x%x",
66117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
66127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
66137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
66147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
66157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
66167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * If there is a video input, allocate and fill the video stream structures for the writer */
66177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->novideo == M4OSA_FALSE )
66187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
66197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
66207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Fill Video properties structure for the AddStream method */
66217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStreamInfo.height = pC->EncodingHeight;
66227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStreamInfo.width = pC->EncodingWidth;
66237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStreamInfo.fps =
66247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            0; /**< Not used by the shell/core writer */
66257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStreamInfo.Header.pBuf =
66267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_NULL; /**< Will be updated later */
66277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStreamInfo.Header.Size = 0; /**< Will be updated later */
66287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
66297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
66307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Fill Video stream description structure for the AddStream method */
66317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pC->EncodingVideoFormat )
66327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
66337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_kMPEG4:
66347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterVideoStream.streamType = M4SYS_kMPEG_4;
66357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
66367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
66377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_kH263:
66387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterVideoStream.streamType = M4SYS_kH263;
66397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
66407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
66417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_kH264:
66427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterVideoStream.streamType = M4SYS_kH264;
66437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
66447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
66457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_kNULL:
66467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                switch( pC->InputFileProperties.VideoStreamType )
66477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
66487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_kMPEG4:
66497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->WriterVideoStream.streamType = M4SYS_kMPEG_4;
66507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
66517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
66527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_kH263:
66537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->WriterVideoStream.streamType = M4SYS_kH263;
66547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
66557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
66567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4VIDEOEDITING_kH264:
66577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->WriterVideoStream.streamType = M4SYS_kH264;
66587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
66597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
66607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    default:
66617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1(
66627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4MCS_intPrepareWriter: case input=M4ENCODER_kNULL, \
66637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            unknown format (0x%x),\
66647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             returning M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FORMAT",
66657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->EncodingVideoFormat);
66667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FORMAT;
66677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
66687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
66697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
66707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            default: /**< It should never happen, already tested */
66717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
66727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intPrepareWriter: unknown format (0x%x),\
66737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     returning M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FORMAT",
66747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->EncodingVideoFormat);
66757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4MCS_ERR_UNDEFINED_OUTPUT_VIDEO_FORMAT;
66767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
66777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
66787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
66797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Video bitrate value will be the real value */
66807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStream.averageBitrate =
66817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Int32)pC->uiEncVideoBitrate;
66827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStream.maxBitrate = (M4OSA_Int32)pC->uiEncVideoBitrate;
66837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
66847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
66857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * most other parameters are "dummy" */
66867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStream.streamID = M4MCS_WRITER_VIDEO_STREAM_ID;
66877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStream.timeScale =
66887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            0; /**< Not used by the shell/core writer */
66897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStream.profileLevel =
66907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            0; /**< Not used by the shell/core writer */
66917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStream.duration =
66927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            0; /**< Not used by the shell/core writer */
66937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStream.decoderSpecificInfoSize =
66947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            sizeof(M4WRITER_StreamVideoInfos);
66957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoStream.decoderSpecificInfo =
66967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_MemAddr32) &(pC->WriterVideoStreamInfo);
66977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
66987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
66997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Update Encoder Header properties for Video stream if needed */
67007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4ENCODER_kH263 == pC->EncodingVideoFormat )
67017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
67027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
67037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Creates the H263 DSI */
67047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->WriterVideoStreamInfo.Header.Size =
67057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                7; /**< H263 output DSI is always 7 bytes */
6706694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            pDSI = (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(7, M4MCS, (M4OSA_Char
67077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *)"pC->WriterVideoStreamInfo.Header.pBuf (DSI H263)");
67087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
67097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4OSA_NULL == pDSI )
67107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
67117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0("M4MCS_intPrepareWriter(): unable to allocate pDSI (H263),\
67127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                               returning M4ERR_ALLOC");
67137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_ALLOC;
67147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
67157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
67167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
67177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Vendor is NXP Software: N, X, P, S. */
67187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDSI[0] = 'N';
67197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDSI[1] = 'X';
67207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDSI[2] = 'P';
67217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDSI[3] = 'S';
67227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
67237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
67247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Decoder version is 0 */
67257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDSI[4] = 0;
67267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
67277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
67287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Level is the sixth byte of the DSI. */
67297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            switch( pC->EncodingWidth )
67307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
67317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4ENCODER_SQCIF_Width:
67327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4ENCODER_QCIF_Width:
67337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( ( pC->uiEncVideoBitrate <= M4ENCODER_k64_KBPS)
67347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (pC->EncodingVideoFramerate <= M4ENCODER_k15_FPS) )
67357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
67367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pDSI[5] = 10;
67377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
67387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else if( ( pC->uiEncVideoBitrate <= M4ENCODER_k128_KBPS)
67397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (pC->EncodingVideoFramerate <= M4ENCODER_k15_FPS) )
67407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
67417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pDSI[5] = 45;
67427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
67437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else if( ( pC->uiEncVideoBitrate <= M4ENCODER_k128_KBPS)
67447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (pC->EncodingVideoFramerate <= M4ENCODER_k30_FPS) )
67457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
67467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pDSI[5] = 20;
67477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
67487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else if( ( pC->uiEncVideoBitrate <= M4ENCODER_k384_KBPS)
67497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (pC->EncodingVideoFramerate <= M4ENCODER_k30_FPS) )
67507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
67517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pDSI[5] = 30;
67527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
67537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else if( ( pC->uiEncVideoBitrate
67547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        <= M4ENCODER_k800_KBPS/*2048*/)
67557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (pC->EncodingVideoFramerate <= M4ENCODER_k30_FPS) )
67567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
67577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pDSI[5] = 40;
67587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
67597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
67607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
67617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4ENCODER_CIF_Width:
67627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( ( pC->uiEncVideoBitrate <= M4ENCODER_k128_KBPS)
67637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (pC->EncodingVideoFramerate <= M4ENCODER_k15_FPS) )
67647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
67657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pDSI[5] = 20;
67667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
67677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else if( ( pC->uiEncVideoBitrate <= M4ENCODER_k384_KBPS)
67687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (pC->EncodingVideoFramerate <= M4ENCODER_k30_FPS) )
67697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
67707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pDSI[5] = 30;
67717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
67727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    else if( ( pC->uiEncVideoBitrate
67737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        <= M4ENCODER_k800_KBPS/*2048*/)
67747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        && (pC->EncodingVideoFramerate <= M4ENCODER_k30_FPS) )
67757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
67767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pDSI[5] = 40;
67777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
67787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
67797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
67807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    default:
67817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
67827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
67837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
67847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
67857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Profile is the seventh byte of the DSI. */
67867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pDSI[6] = 0;
67877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
67887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->WriterVideoStreamInfo.Header.pBuf = pDSI;
67897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
67907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else if( M4ENCODER_kNULL == pC->EncodingVideoFormat )
67917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
67927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* If we copy the stream from the input, we copy its DSI */
67937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
67947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->WriterVideoStreamInfo.Header.Size = pC->pReaderVideoStream->
67957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_basicProperties.m_decoderSpecificInfoSize;
67967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->WriterVideoStreamInfo.Header.pBuf =
67977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_MemAddr8)pC->pReaderVideoStream->
67987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_basicProperties.m_pDecoderSpecificInfo;
67997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
68007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
68017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* otherwise (MPEG4), the DSI will be recovered from the encoder later on. */
68027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
68037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*+CRLV6775 - H.264 Trimming  */
68047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->bH264Trim == M4OSA_TRUE )
68057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
68067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            bMULPPSSPS = M4OSA_TRUE;
68077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->pWriterGlobalFcts->pFctSetOption(pC->pWriterContext,
68087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_UInt32)M4WRITER_kMUL_PPS_SPS,
68097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_DataOption) &bMULPPSSPS);
68107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
68117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( ( M4NO_ERROR != err)
68127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                && (( (M4OSA_UInt32)M4ERR_BAD_OPTION_ID)
68137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                != err) ) /* this option may not be implemented by some writers */
68147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
68157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
68167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intPrepareWriter:\
68177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     pWriterGlobalFcts->pFctSetOption(M4WRITER_kMUL_PPS_SPS) returns 0x%x",
68187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
68197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
68207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
68217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
68227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*-CRLV6775 - H.264 Trimming  */
68237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
68247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Add the video stream */
68257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pWriterGlobalFcts->pFctAddStream(pC->pWriterContext,
68267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pC->WriterVideoStream);
68277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
68287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
68297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
68307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
68317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareWriter: pWriterGlobalFcts->pFctAddStream(video) returns 0x%x!",
68327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
68337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
68347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
68357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
68367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
68377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Update AU properties for video stream */
68387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoAU.stream = &(pC->WriterVideoStream);
68397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoAU.dataAddress = M4OSA_NULL;
68407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoAU.size = 0;
68417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoAU.CTS = 0; /** Reset time */
68427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoAU.DTS = 0;
68437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoAU.attribute = AU_RAP;
68447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoAU.nbFrag = 0; /** No fragment */
68457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterVideoAU.frag = M4OSA_NULL;
68467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
68477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
68487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Set the writer max video AU size */
68497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        optionValue.streamID = M4MCS_WRITER_VIDEO_STREAM_ID;
68507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        optionValue.value = pC->uiVideoMaxAuSize;
68517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pWriterGlobalFcts->pFctSetOption(pC->pWriterContext,
68527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt32)M4WRITER_kMaxAUSize,
68537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_DataOption) &optionValue);
68547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
68557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
68567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
68577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
68587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareWriter: \
68597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pWriterGlobalFcts->pFctSetOption(M4WRITER_kMaxAUSize, video) returns 0x%x!",
68607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
68617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
68627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
68637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
68647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
68657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Set the writer max video chunk size */
68667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        optionValue.value = pC->uiVideoMaxChunckSize;
68677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pWriterGlobalFcts->pFctSetOption(pC->pWriterContext,
68687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt32)M4WRITER_kMaxChunckSize,
68697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_DataOption) &optionValue);
68707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
68717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( M4NO_ERROR != err) && (( (M4OSA_UInt32)M4ERR_BAD_OPTION_ID)
68727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            != err) ) /* this option may not be implemented by some writers */
68737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
68747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
68757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareWriter:\
68767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 pWriterGlobalFcts->pFctSetOption(M4WRITER_kMaxAUSize, video) returns 0x%x!",
68777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
68787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
68797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
68807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
68817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
68827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
68837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * If there is an audio input, allocate and fill the audio stream structures for the writer */
68847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->noaudio == M4OSA_FALSE )
68857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
68867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4WRITER_StreamAudioInfos streamAudioInfo;
68877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
68887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        streamAudioInfo.nbSamplesPerSec = 0; /**< unused by our shell writer */
68897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        streamAudioInfo.nbBitsPerSample = 0; /**< unused by our shell writer */
68907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        streamAudioInfo.nbChannels = 1;      /**< unused by our shell writer */
68917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
68927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioStream.averageBitrate =
68937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            0; /**< It is not used by the shell, the DSI is taken into account instead */
68947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioStream.maxBitrate =
68957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            0; /**< Not used by the shell/core writer */
68967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
68977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
68987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Fill Audio stream description structure for the AddStream method */
68997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pC->AudioEncParams.Format )
69007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
69017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_kAMRNB:
69027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterAudioStream.streamType = M4SYS_kAMR;
69037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
69047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
69057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_kAAC:
69067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterAudioStream.streamType = M4SYS_kAAC;
69077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterAudioStream.averageBitrate =
69087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioEncParams.Bitrate;
69097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterAudioStream.maxBitrate = pC->AudioEncParams.Bitrate;
69107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
69117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
69127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /*FlB 26.02.2009: add mp3 as output format*/
69137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_kMP3:
69147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterAudioStream.streamType = M4SYS_kMP3;
69157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
69167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
69177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_kAudioNULL:
69187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                switch( pC->InputFileProperties.AudioStreamType )
69197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
69207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kAMR_NB:
69217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->WriterAudioStream.streamType = M4SYS_kAMR;
69227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
69237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /*FlB 26.02.2009: add mp3 as output format*/
69247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kMP3:
69257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->WriterAudioStream.streamType = M4SYS_kMP3;
69267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
69277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
69287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kAAC:
69297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kAACplus:
69307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_keAACplus:
69317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->WriterAudioStream.streamType = M4SYS_kAAC;
69327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->WriterAudioStream.averageBitrate =
69337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.Bitrate;
69347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->WriterAudioStream.maxBitrate =
69357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->AudioEncParams.Bitrate;
69367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
69377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
69387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kEVRC:
69397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->WriterAudioStream.streamType = M4SYS_kEVRC;
69407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
69417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
69427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kNoneAudio:
69437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kPCM:
69447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kNullAudio:
69457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                case M4VIDEOEDITING_kUnsupportedAudio:
69467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    break;
69477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
69487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
69497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
69507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            default: /**< It should never happen, already tested */
69517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
69527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intPrepareWriter: \
69537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    unknown format (0x%x), returning M4MCS_ERR_UNDEFINED_OUTPUT_AUDIO_FORMAT",
69547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioEncParams.Format);
69557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4MCS_ERR_UNDEFINED_OUTPUT_AUDIO_FORMAT;
69567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
69577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
69587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
69597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * MCS produces only AMR-NB output */
69607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioStream.streamID = M4MCS_WRITER_AUDIO_STREAM_ID;
69617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioStream.duration =
69627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            0; /**< Not used by the shell/core writer */
69637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioStream.profileLevel =
69647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            0; /**< Not used by the shell/core writer */
69657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioStream.timeScale = pC->AudioEncParams.Frequency;
69667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
69677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->AudioEncParams.Format == M4ENCODER_kAudioNULL )
69687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
69697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* If we copy the stream from the input, we copy its DSI */
69707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            streamAudioInfo.Header.Size = pC->pReaderAudioStream->
69717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_basicProperties.m_decoderSpecificInfoSize;
69727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            streamAudioInfo.Header.pBuf =
69737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_MemAddr8)pC->pReaderAudioStream->
69747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_basicProperties.m_pDecoderSpecificInfo;
69757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
69767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
69777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
69787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->pAudioEncDSI.pInfo != M4OSA_NULL )
69797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
69807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Use the DSI given by the encoder open() */
69817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamAudioInfo.Header.Size = pC->pAudioEncDSI.infoSize;
69827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamAudioInfo.Header.pBuf = pC->pAudioEncDSI.pInfo;
69837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
69847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
69857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
69867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Writer will put a default Philips DSI */
69877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamAudioInfo.Header.Size = 0;
69887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                streamAudioInfo.Header.pBuf = M4OSA_NULL;
69897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
69907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
69917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
69927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
69937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Our writer shell interface is a little tricky: we put M4WRITER_StreamAudioInfos
69947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         in the DSI pointer... */
69957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioStream.decoderSpecificInfo =
69967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_MemAddr32) &streamAudioInfo;
69977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
69987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
69997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Add the audio stream to the writer */
70007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pWriterGlobalFcts->pFctAddStream(pC->pWriterContext,
70017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pC->WriterAudioStream);
70027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
70037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
70047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
70057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
70067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareWriter: pWriterGlobalFcts->pFctAddStream(audio) returns 0x%x",
70077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
70087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
70097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
70107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
70117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
70127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Link the AU and the stream */
70137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.stream = &(pC->WriterAudioStream);
70147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.dataAddress = M4OSA_NULL;
70157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.size = 0;
70167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.CTS = 0; /** Reset time */
70177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.DTS = 0;
70187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.attribute = 0;
70197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.nbFrag = 0; /** No fragment */
70207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.frag = M4OSA_NULL;
70217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
70227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
70237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Set the writer audio max AU size */
70247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* As max bitrate is now 320kbps instead of 128kbps, max AU
70257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         * size has to be increased adapt the max AU size according to the stream type and the
70267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         * channels numbers*/
70277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* After tests, a margin of 3 is taken (2 was not enough and raises to memory overwrite)
70287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         */
70297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //pC->uiAudioMaxAuSize = M4MCS_AUDIO_MAX_AU_SIZE;
70307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pC->WriterAudioStream.streamType )
70317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
70327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4SYS_kAMR:
70337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->uiAudioMaxAuSize = M4MCS_PCM_AMR_GRANULARITY_SAMPLES
70347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * (( pC->InputFileProperties.uiNbChannels
70357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * sizeof(short)) + 3);
70367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
70377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
70387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4SYS_kMP3:
70397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->uiAudioMaxAuSize = M4MCS_PCM_MP3_GRANULARITY_SAMPLES
70407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * (( pC->InputFileProperties.uiNbChannels
70417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * sizeof(short)) + 3);
70427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
70437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
70447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4SYS_kAAC:
70457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->uiAudioMaxAuSize = M4MCS_PCM_AAC_GRANULARITY_SAMPLES
70467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * (( pC->InputFileProperties.uiNbChannels
70477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * sizeof(short)) + 3);
70487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
70497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /*case M4SYS_kEVRC:
70507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->uiAudioMaxAuSize = M4MCS_PCM_EVRC_GRANULARITY_SAMPLES*
70517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                ((pC->InputFileProperties.uiNbChannels * sizeof(short))+3);
70527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;*/
70537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            default: /**< It should never happen, already tested */
70547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
70557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intPrepareWriter: unknown format (0x%x),\
70567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     returning M4MCS_ERR_UNDEFINED_OUTPUT_AUDIO_FORMAT",
70577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->WriterAudioStream.streamType);
70587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4MCS_ERR_UNDEFINED_OUTPUT_AUDIO_FORMAT;
70597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
70607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
70617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        optionValue.streamID = M4MCS_WRITER_AUDIO_STREAM_ID;
70627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        optionValue.value = pC->uiAudioMaxAuSize;
70637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pWriterGlobalFcts->pFctSetOption(pC->pWriterContext,
70647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt32)M4WRITER_kMaxAUSize,
70657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_DataOption) &optionValue);
70667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
70677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
70687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
70697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
70707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareWriter: pWriterGlobalFcts->pFctSetOption(audio,\
70717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4WRITER_kMaxAUSize) returns 0x%x",
70727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
70737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
70747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
70757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
70767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        optionValue.value = M4MCS_AUDIO_MAX_CHUNK_SIZE;
70777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pWriterGlobalFcts->pFctSetOption(pC->pWriterContext,
70787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt32)M4WRITER_kMaxChunckSize,
70797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_DataOption) &optionValue);
70807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
70817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( M4NO_ERROR != err) && (( (M4OSA_UInt32)M4ERR_BAD_OPTION_ID)
70827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            != err) ) /* this option may not be implemented by some writers */
70837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
70847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
70857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intPrepareWriter: pWriterGlobalFcts->pFctSetOption(audio,\
70867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4WRITER_kMaxChunckSize) returns 0x%x",
70877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
70887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
70897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
70907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
70917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
70927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*
70937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Set the limitation size of the writer */
70947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    TargetedFileSize = pC->uiMaxFileSize;
70957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* add 1 kB margin */
70967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( TargetedFileSize > 8192 )
70977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        TargetedFileSize -= 1024;
70987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
70997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->pWriterGlobalFcts->pFctSetOption(pC->pWriterContext,
71007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_UInt32)M4WRITER_kMaxFileSize,
71017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_DataOption) &TargetedFileSize);
71027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
71037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( M4NO_ERROR != err) && (( (M4OSA_UInt32)M4ERR_BAD_OPTION_ID)
71047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        != err) ) /* this option may not be implemented by some writers */
71057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
71067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
71077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareWriter: pWriterGlobalFcts->pFctSetOption\
71087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4WRITER_kMaxFileSize) returns 0x%x!",
71097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
71107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
71117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
71127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
71137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
71147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Close the stream registering in order to be ready to write data */
71157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->pWriterGlobalFcts->pFctStartWriting(pC->pWriterContext);
71167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
71177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
71187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
71197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
71207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareWriter: pWriterGlobalFcts->pFctStartWriting returns 0x%x",
71217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
71227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
71237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
71247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
71257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
71267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
71277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_intPrepareWriter(): returning M4NO_ERROR");
71287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
71297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
71307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
71317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
71327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
71337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intPrepareAudioBeginCut(M4MCS_InternalContext* pC);
71347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    DO the audio begin cut.
71357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pC          (IN) MCS private context
71367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR  No error
71377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   Any error returned by an underlaying module
71387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
71397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
71407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intPrepareAudioBeginCut( M4MCS_InternalContext *pC )
71417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
71427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
71437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 iCts;
71447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 uiFrameSize;
71457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
71467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->noaudio )
71477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
71487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
71497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
71507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check if an audio begin cut is needed */
71517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( M4OSA_NULL == pC->pReaderAudioStream) || (0 == pC->uiBeginCutTime) )
71527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
71537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
71547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Return with no error */
71557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE3_0(
71567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareAudioBeginCut(): returning M4NO_ERROR (a)");
71577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
71587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
71597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
71607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
71617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Jump at the begin cut time */
71627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    iCts = pC->uiBeginCutTime;
71637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->m_pReader->m_pFctJump(pC->pReaderContext,
71647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4_StreamHandler *)pC->pReaderAudioStream, &iCts);
71657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
71667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
71677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
71687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
71697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intPrepareAudioBeginCut: m_pFctJump(Audio) returns 0x%x!",
71707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
71717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
71727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
71737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
71747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
71757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Remember audio begin cut offset */
71767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->iAudioCtsOffset = iCts;
71777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
71787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
71797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * AMR-NB & EVRC: there may be many frames per AU.
71807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * In that case we need to slice the first AU to keep the 20 ms cut precision */
71817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( M4DA_StreamTypeAudioAmrNarrowBand
71827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        == pC->pReaderAudioStream->m_basicProperties.m_streamType)
71837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || (M4DA_StreamTypeAudioEvrc
71847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        == pC->pReaderAudioStream->m_basicProperties.m_streamType) )
71857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
71867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
71877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * If the next frame CTS is lower than the begin cut time,
71887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * we must read the AU and parse its frames to reach the
71897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * nearest to the begin cut */
71907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( iCts + 20) < (M4OSA_Int32)pC->uiBeginCutTime )
71917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
71927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
71937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Read the first audio AU after the jump */
71947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->m_pReaderDataIt->m_pFctGetNextAu(pC->pReaderContext,
71957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_StreamHandler *)pC->pReaderAudioStream,
71967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &pC->ReaderAudioAU);
71977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
71987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4WAR_NO_MORE_AU == err )
71997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
72007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0(
72017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intPrepareAudioBeginCut(): m_pReaderDataIt->m_pFctGetNextAu(audio)\
72027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     returns M4WAR_NO_MORE_AU! Returning M4NO_ERROR");
72037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return
72047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4NO_ERROR; /**< no fatal error here, we should be able to pursue */
72057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
72067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if( M4NO_ERROR != err )
72077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
72087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
72097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intPrepareAudioBeginCut(): m_pReaderDataIt->m_pFctGetNextAu(Audio)\
72107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     returns 0x%x",
72117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
72127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
72137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
72147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
72157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
72167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * While the next AU has a lower CTS than the begin cut time, we advance to
72177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            the next frame */
72187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            while( ( iCts + 20) <= (M4OSA_Int32)pC->uiBeginCutTime )
72197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
72207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
72217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Get the size of the frame */
72227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                switch( pC->pReaderAudioStream->m_basicProperties.m_streamType )
72237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
72247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4DA_StreamTypeAudioAmrNarrowBand:
72257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        uiFrameSize = M4MCS_intGetFrameSize_AMRNB(
72267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ReaderAudioAU.m_dataAddress);
72277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
72287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
72297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    case M4DA_StreamTypeAudioEvrc:
72307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        uiFrameSize = M4MCS_intGetFrameSize_EVRC(
72317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            pC->ReaderAudioAU.m_dataAddress);
72327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
72337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
72347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    default:
72357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        uiFrameSize = 0;
72367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        break;
72377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
72387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
72397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( 0 == uiFrameSize )
72407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
72417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
72427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Corrupted frame! We get out of this mess!
72437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * We don't want to crash here... */
72447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_0(
72457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_intPrepareAudioBeginCut(): \
72467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4MCS_intGetFrameSize_xxx returns 0! Returning M4NO_ERROR");
72477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return
72487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4NO_ERROR; /**< no fatal error here, we should be able to pursue */
72497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
72507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
72517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
72527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Go to the next frame */
72537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderAudioAU.m_dataAddress += uiFrameSize;
72547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderAudioAU.m_size -= uiFrameSize;
72557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
72567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
72577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Get the CTS of the next frame */
72587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                iCts += 20; /**< AMR, EVRC frame duration is always 20 ms */
72597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderAudioAU.m_CTS = iCts;
72607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderAudioAU.m_DTS = iCts;
72617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
72627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
72637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
72647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Update the audio begin cut offset */
72657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->iAudioCtsOffset = iCts;
72667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
72677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
72687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
72697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
72707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
72717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_intPrepareAudioBeginCut(): returning M4NO_ERROR");
72727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
72737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
72747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
72757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
72767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
72777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intStepEncoding(M4MCS_InternalContext* pC, M4OSA_UInt8* pProgress)
72787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
72797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
72807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intStepEncoding( M4MCS_InternalContext *pC,
72817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                       M4OSA_UInt8 *pProgress )
72827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
72837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
72847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 uiAudioStepCount = 0;
72857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
72867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ---------- VIDEO TRANSCODING ---------- */
72877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
72887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->novideo == M4OSA_FALSE) && (M4MCS_kStreamState_STARTED
72897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        == pC->VideoState) ) /**< If the video encoding is going on */
72907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
72917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->EncodingVideoFormat == M4ENCODER_kNULL )
72927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
72937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4MCS_intVideoNullEncoding(pC);
72947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
72957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
72967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
72977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4MCS_intVideoTranscoding(pC);
72987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
72997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
73017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * No more space, quit properly */
73027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4WAR_WRITER_STOP_REQ == err )
73037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
73047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pProgress = (M4OSA_UInt8)(( ( (M4OSA_UInt32)pC->dViDecCurrentCts
73057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                - pC->uiBeginCutTime) * 100)
73067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                / (pC->uiEndCutTime - pC->uiBeginCutTime));
73077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->State = M4MCS_kState_FINISHED;
73097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* bad file produced on very short 3gp file */
73117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->dViDecCurrentCts - pC->uiBeginCutTime == 0 )
73127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
73137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Nothing has been encoded -> bad produced file -> error returned */
73147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE2_0(
73157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intStepEncoding(): video transcoding returns\
73167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     M4MCS_ERR_OUTPUT_FILE_SIZE_TOO_SMALL");
73177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4MCS_ERR_OUTPUT_FILE_SIZE_TOO_SMALL;
73187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
73197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
73207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
73217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef M4MCS_AUDIOONLY
73227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* clean AIR context needed to keep media aspect ratio*/
73237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4OSA_NULL != pC->m_air_context )
73257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
73267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = M4AIR_cleanUp(pC->m_air_context);
73277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( err != M4NO_ERROR )
73297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
73307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1(
73317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4xVSS_PictureCallbackFct: Error when cleaning AIR: 0x%x",
73327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err);
73337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
73347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
73357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->m_air_context = M4OSA_NULL;
73367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
73377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_AUDIOONLY*/
73397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE2_0(
73417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intStepEncoding(): video transcoding returns M4MCS_ERR_NOMORE_SPACE");
73427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4MCS_ERR_NOMORE_SPACE;
73437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
73447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
73457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**< The input plane is null because the input image will be obtained by the
73477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        VPP filter from the context */
73487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( M4NO_ERROR != err) && (M4WAR_NO_MORE_AU != err) )
73497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
73507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
73517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intStepEncoding(): video transcoding returns 0x%x!",
73527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
73537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
73547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
73557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
73567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ---------- AUDIO TRANSCODING ---------- */
73587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->noaudio == M4OSA_FALSE) && (M4MCS_kStreamState_STARTED
73607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        == pC->AudioState) ) /**< If there is an audio stream */
73617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
73627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        while(
73637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< If the video encoding is running, encode audio until we reach video time */
73647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ( ( pC->novideo == M4OSA_FALSE)
73657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            && (M4MCS_kStreamState_STARTED == pC->VideoState)
73667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            && (pC->ReaderAudioAU.m_CTS
73677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            + pC->m_audioAUDuration < pC->ReaderVideoAU.m_CTS)) ||
73687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< If the video encoding is not running, perform 1 step of audio encoding */
73697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (( M4MCS_kStreamState_STARTED == pC->AudioState)
73707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            && (uiAudioStepCount < 1)) )
73717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
73727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            uiAudioStepCount++;
73737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< check if an adio effect has to be applied*/
73757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4MCS_intCheckAudioEffects(pC);
73767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
73787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
73797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
73807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intStepEncoding(): M4MCS_intCheckAudioEffects returns err: 0x%x",
73817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
73827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
73837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
73847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->AudioEncParams.Format == M4ENCODER_kAudioNULL )
73867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
73877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4MCS_intAudioNullEncoding(pC);
73887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
73897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else /**< Audio transcoding */
73907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
73917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = M4MCS_intAudioTranscoding(pC);
73927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
73937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
73947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
73957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * No more space, quit properly */
73967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4WAR_WRITER_STOP_REQ == err )
73977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
73987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *pProgress =
73997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_UInt8)(( ( (M4OSA_UInt32)pC->ReaderAudioAU.m_CTS
74007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    - pC->uiBeginCutTime) * 100)
74017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    / (pC->uiEndCutTime - pC->uiBeginCutTime));
74027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
74037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->State = M4MCS_kState_FINISHED;
74047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
74057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* bad file produced on very short 3gp file */
74067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->ReaderAudioAU.m_CTS - pC->uiBeginCutTime == 0 )
74077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
74087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* Nothing has been encoded -> bad produced file -> error returned */
74097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE2_0(
74107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_intStepEncoding():\
74117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                         audio transcoding returns M4MCS_ERR_OUTPUT_FILE_SIZE_TOO_SMALL");
74127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4MCS_ERR_OUTPUT_FILE_SIZE_TOO_SMALL;
74137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
74147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else
74157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
74167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef M4MCS_AUDIOONLY
74177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /* clean AIR context needed to keep media aspect ratio*/
74187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
74197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( M4OSA_NULL != pC->m_air_context )
74207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
74217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err = M4AIR_cleanUp(pC->m_air_context);
74227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
74237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        if( err != M4NO_ERROR )
74247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        {
74257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            M4OSA_TRACE1_1(
74267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                "M4xVSS_PictureCallbackFct: Error when cleaning AIR: 0x%x",
74277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                err);
74287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            return err;
74297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        }
74307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->m_air_context = M4OSA_NULL;
74317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
74327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
74337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_AUDIOONLY*/
74347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
74357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE2_0(
74367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_intStepEncoding(): \
74377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        audio transcoding returns M4MCS_ERR_NOMORE_SPACE");
74387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return M4MCS_ERR_NOMORE_SPACE;
74397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
74407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
74417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
74427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4WAR_NO_MORE_AU == err )
74437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
74447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->AudioState = M4MCS_kStreamState_FINISHED;
74457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE3_0(
74467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intStepEncoding(): audio transcoding returns M4WAR_NO_MORE_AU");
74477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
74487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
74497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if( M4NO_ERROR != err )
74507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
74517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
74527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intStepEncoding(): audio transcoding returns 0x%x",
74537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
74547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
74557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
74567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
74577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
74587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Check for end cut */
74597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* We absolutely want to have less or same audio duration as video ->
74607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (2*pC->m_audioAUDuration) */
74617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( (M4OSA_UInt32)pC->ReaderAudioAU.m_CTS
74627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                + (2 *pC->m_audioAUDuration) > pC->uiEndCutTime )
74637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
74647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->AudioState = M4MCS_kStreamState_FINISHED;
74657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
74667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
74677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
74687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
74697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
74707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ---------- PROGRESS MANAGEMENT ---------- */
74717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
74727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
74737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Compute progress */
74747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->novideo )
74757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
74767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->ReaderAudioAU.m_CTS < pC->uiBeginCutTime )
74777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
74787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pProgress = 0;
74797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
74807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
74817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
74827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pProgress = (M4OSA_UInt8)(( ( (M4OSA_UInt32)pC->ReaderAudioAU.m_CTS
74837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                - pC->uiBeginCutTime) * 100)
74847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                / (pC->uiEndCutTime - pC->uiBeginCutTime));
74857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
74867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //printf(": %6.0f\b\b\b\b\b\b\b\b", pC->ReaderAudioAU.m_CTS);
74877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
74887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
74897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
74907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
74917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->dViDecCurrentCts < pC->uiBeginCutTime )
74927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
74937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pProgress = 0;
74947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
74957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
74967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
74977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *pProgress = (M4OSA_UInt8)(( ( (M4OSA_UInt32)pC->dViDecCurrentCts
74987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                - pC->uiBeginCutTime) * 100)
74997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                / (pC->uiEndCutTime - pC->uiBeginCutTime));
75007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
75017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //printf(": %6.0f\b\b\b\b\b\b\b\b", pC->dViDecCurrentCts);
75027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
75037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
75047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
75057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Sanity check */
75067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( *pProgress > 99 )
75077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
75087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pProgress = 99;
75097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
75107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
75117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
75127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Increment CTS for next step */
75137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->novideo == M4OSA_FALSE )
75147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
75157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->EncodingVideoFormat == M4ENCODER_kNULL )
75167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
75177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi           pC->dViDecCurrentCts +=  1;
75187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
75197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
75207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
75217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->dViDecCurrentCts += pC->dCtsIncrement;
75227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
75237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
75247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
75257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
75267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * The transcoding is finished when no stream is being encoded anymore */
75277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( ( pC->novideo) || (M4MCS_kStreamState_FINISHED == pC->VideoState))
75287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (( pC->noaudio) || (M4MCS_kStreamState_FINISHED == pC->AudioState)) )
75297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
75307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* the AIR part can only be used when video codecs are compiled*/
75317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef M4MCS_AUDIOONLY
75327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* clean AIR context needed to keep media aspect ratio*/
75337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
75347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_NULL != pC->m_air_context )
75357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
75367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4AIR_cleanUp(pC->m_air_context);
75377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
75387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( err != M4NO_ERROR )
75397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
75407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
75417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4xVSS_PictureCallbackFct: Error when cleaning AIR: 0x%x",
75427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
75437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
75447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
75457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_air_context = M4OSA_NULL;
75467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
75477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
75487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*M4MCS_AUDIOONLY*/
75497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**/
75507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
75517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pProgress = 100;
75527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4MCS_kState_FINISHED;
75537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE2_0(
75547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intStepEncoding(): transcoding finished, returning M4MCS_WAR_TRANSCODING_DONE");
75557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_WAR_TRANSCODING_DONE;
75567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
75577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
75587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
75597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
75607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_intStepEncoding(): returning M4NO_ERROR");
75617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
75627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
75637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
75647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
75657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
75667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intStepBeginVideoJump(M4MCS_InternalContext* pC)
75677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
75687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
75697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intStepBeginVideoJump( M4MCS_InternalContext *pC )
75707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
75717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
75727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 iCts;
75737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
75747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->novideo )
75757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
75767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4MCS_kState_BEGINVIDEODECODE;
75777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
75787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
75797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
75807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
75817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Jump to the previous RAP in the clip (first get the time, then jump) */
75827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    iCts = (M4OSA_Int32)pC->dViDecStartingCts;
75837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->m_pReader->m_pFctGetPrevRapTime(pC->pReaderContext,
75847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4_StreamHandler *)pC->pReaderVideoStream, &iCts);
75857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
75867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4WAR_READER_INFORMATION_NOT_PRESENT == err )
75877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
75887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* No RAP table, jump backward and predecode */
75897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        iCts = (M4OSA_Int32)pC->dViDecStartingCts - M4MCS_NO_STSS_JUMP_POINT;
75907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
75917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( iCts < 0 )
75927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            iCts = 0;
75937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
75947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( M4NO_ERROR != err )
75957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
75967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
75977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intStepBeginVideoJump: m_pFctGetPrevRapTime returns 0x%x!",
75987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
75997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
76007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
76017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* + CRLV6775 -H.264 Trimming */
76037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_TRUE == pC->bH264Trim )
76057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
76067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Save jump time for safety, this fix should be generic
76087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_Int32 iCtsOri = iCts;
76107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReader->m_pFctJump(pC->pReaderContext,
76137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4_StreamHandler *)pC->pReaderVideoStream, &iCts);
76147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
76167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
76177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
76187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intStepBeginVideoJump: m_pFctJump(V) returns 0x%x!",
76197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
76207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
76217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
76227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->ReaderVideoAU1.m_structSize == 0 )
76247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
76257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
76267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Initializes an access Unit */
76277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->m_pReader->m_pFctFillAuStruct(pC->pReaderContext,
76287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_StreamHandler *)pC->pReaderVideoStream,
76297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &pC->ReaderVideoAU1);
76307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
76327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
76337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
76347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_open(): m_pReader->m_pFctFillAuStruct(video) returns 0x%x",
76357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
76367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
76377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
76387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->m_pReaderDataIt->m_pFctGetNextAu(pC->pReaderContext,
76397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_StreamHandler *)pC->pReaderVideoStream,
76407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &pC->ReaderVideoAU1);
76417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4WAR_NO_MORE_AU == err )
76437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
76447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE2_0(
76457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intVideoNullEncoding(): \
76467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    m_pReaderDataIt->m_pFctGetNextAu(video) returns M4WAR_NO_MORE_AU");
76477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* The audio transcoding is finished */
76487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->VideoState = M4MCS_kStreamState_FINISHED;
76497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
76507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
76517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if( M4NO_ERROR != err )
76527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
76537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
76547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intVideoNullEncoding():\
76557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     m_pReaderDataIt->m_pFctGetNextAu(video) returns 0x%x",
76567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
76577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
76587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
76597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ReaderVideoAU1.m_structSize = 0;
76617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
76627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = H264MCS_ProcessSPS_PPS(pC->m_pInstance,
76647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt8 *)pC->ReaderVideoAU1.m_dataAddress, pC->ReaderVideoAU1.m_size);
76657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
76677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
76687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
76697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intStepBeginVideoJump: H264MCS_ProcessSPS_PPS returns 0x%x!",
76707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
76717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
76727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
76737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Restore jump time for safety, this fix should be generic
76767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        iCts = iCtsOri;
76787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
76817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* - CRLV6775 -H.264 Trimming */
76827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
76847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Decode one step */
76857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->dViDecCurrentCts = (M4OSA_Double)(iCts + pC->iVideoBeginDecIncr);
76867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
76887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Be sure we don't decode too far */
76897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->dViDecCurrentCts > pC->dViDecStartingCts )
76907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
76917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->dViDecCurrentCts = pC->dViDecStartingCts;
76927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
76937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
76947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
76957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Decode at least once with the bJump flag to true */
76967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_1(
76977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4VSS3GPP_intClipDecodeVideoUpToCts: Decoding upTo CTS %.3f",
76987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->dViDecCurrentCts);
76997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->isRenderDup = M4OSA_FALSE;
77007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err =
77017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->m_pVideoDecoder->m_pFctDecode(pC->pViDecCtxt, &pC->dViDecCurrentCts,
7702b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang        M4OSA_TRUE, 0);
77037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( M4NO_ERROR != err) && (M4WAR_NO_MORE_AU != err)
77057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (err != M4WAR_VIDEORENDERER_NO_NEW_FRAME) )
77067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
77077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
77087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intStepBeginVideoJump: m_pFctDecode returns 0x%x!", err);
77097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
77107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
77117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( err == M4WAR_VIDEORENDERER_NO_NEW_FRAME )
77137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
77147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE2_0("Decoding output the same frame as before 1");
77157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->isRenderDup = M4OSA_TRUE;
77167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
77177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
77197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Increment decoding cts for the next step */
77207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->dViDecCurrentCts += (M4OSA_Double)pC->iVideoBeginDecIncr;
77217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
77237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Update state automaton */
77247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->dViDecCurrentCts > pC->dViDecStartingCts )
77257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
77267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
77277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Be sure we don't decode too far */
77287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->dViDecCurrentCts = pC->dViDecStartingCts;
77297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4MCS_kState_PROCESSING;
77307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
77317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
77327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
77337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4MCS_kState_BEGINVIDEODECODE;
77347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
77357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
77377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
77387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_intStepBeginVideoJump(): returning M4NO_ERROR");
77397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
77407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
77417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
77437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
77447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intStepBeginVideoDecode(M4MCS_InternalContext* pC)
77457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
77467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
77477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intStepBeginVideoDecode( M4MCS_InternalContext *pC )
77487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
77497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
77507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_MediaTime dDecTarget;
77517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->novideo )
77537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
77547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4MCS_kState_PROCESSING;
77557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
77567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
77577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
77597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Decode */
77607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    dDecTarget = pC->dViDecCurrentCts;
77617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_1("M4MCS_intStepBeginDecode: Decoding upTo CTS %.3f",
77627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->dViDecCurrentCts);
77637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->isRenderDup = M4OSA_FALSE;
77647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->m_pVideoDecoder->m_pFctDecode(pC->pViDecCtxt, &dDecTarget,
7765b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang        M4OSA_FALSE, 0);
77667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( M4NO_ERROR != err) && (M4WAR_NO_MORE_AU != err)
77687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (err != M4WAR_VIDEORENDERER_NO_NEW_FRAME) )
77697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
77707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
77717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intStepBeginVideoDecode: m_pFctDecode returns 0x%x!", err);
77727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
77737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
77747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( err == M4WAR_VIDEORENDERER_NO_NEW_FRAME )
77767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
77777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE2_0("Decoding output the same frame as before 2");
77787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->isRenderDup = M4OSA_TRUE;
77797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
77807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
77827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Increment decoding cts for the next step */
77837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->dViDecCurrentCts += (M4OSA_Double)pC->iVideoBeginDecIncr;
77847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
77867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Update state automaton, if needed */
77877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( (M4OSA_UInt32)pC->dViDecCurrentCts > pC->dViDecStartingCts)
77887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || (M4WAR_NO_MORE_AU == err) )
77897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
77907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
77917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Be sure we don't decode too far */
77927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->dViDecCurrentCts = (M4OSA_Double)pC->dViDecStartingCts;
77937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->State = M4MCS_kState_PROCESSING;
77947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
77957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
77967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
77977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
77987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_intStepBeginVideoDecode(): returning M4NO_ERROR");
77997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
78007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
78017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*****************************/
78037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* define AMR silence frames */
78047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*****************************/
78057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE 13
78077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_DURATION 160
78087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS3GPP_SILENCE_FRAMES
78107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UInt8 M4VSS3GPP_AMR_AU_SILENCE_FRAME_048[
78127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE] =
78137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
78147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        0x04, 0xFF, 0x18, 0xC7, 0xF0, 0x0D, 0x04, 0x33, 0xFF, 0xE0, 0x00, 0x00, 0x00
78157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    };
78167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else
78177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiextern
78197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst
78207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_UInt8
78217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VSS3GPP_AMR_AU_SILENCE_FRAME_048[M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE];
78227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
78247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*****************************/
78267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* define AAC silence frames */
78277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*****************************/
78287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4VSS3GPP_AAC_AU_SILENCE_MONO_SIZE      4
78307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS3GPP_SILENCE_FRAMES
78327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UInt8 M4VSS3GPP_AAC_AU_SILENCE_MONO[
78347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_AAC_AU_SILENCE_MONO_SIZE] =
78357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
78367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        0x00, 0xC8, 0x20, 0x07
78377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    };
78387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else
78397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiextern const M4OSA_UInt8
78417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VSS3GPP_AAC_AU_SILENCE_MONO[M4VSS3GPP_AAC_AU_SILENCE_MONO_SIZE];
78427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
78447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4VSS3GPP_AAC_AU_SILENCE_STEREO_SIZE        6
78467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS3GPP_SILENCE_FRAMES
78487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UInt8 M4VSS3GPP_AAC_AU_SILENCE_STEREO[
78507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VSS3GPP_AAC_AU_SILENCE_STEREO_SIZE] =
78517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
78527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        0x21, 0x10, 0x03, 0x20, 0x54, 0x1C
78537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    };
78547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else
78557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiextern const
78577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_UInt8
78587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VSS3GPP_AAC_AU_SILENCE_STEREO[M4VSS3GPP_AAC_AU_SILENCE_STEREO_SIZE];
78597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
78617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
78637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
78647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intAudioNullEncoding(M4MCS_InternalContext* pC)
78657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR:         No error
78667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
78677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
78687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intAudioNullEncoding( M4MCS_InternalContext *pC )
78707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
78717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
78727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->noaudio )
78747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
78757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check if all audio frame has been written (happens at begin cut) */
78777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->ReaderAudioAU.m_size == 0 )
78787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
78797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
78807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Initializes a new AU if needed */
78817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->ReaderAudioAU1.m_structSize == 0 )
78827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
78837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
78847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Initializes an access Unit */
78857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->m_pReader->m_pFctFillAuStruct(pC->pReaderContext,
78867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_StreamHandler *)pC->pReaderAudioStream,
78877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &pC->ReaderAudioAU1);
78887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
78907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
78917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
78927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_open(): m_pReader->m_pFctFillAuStruct(audio) returns 0x%x",
78937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
78947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
78957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
78967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
78977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_pDataAddress1 =
7898694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pC->ReaderAudioAU1.m_maxsize,
78997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4MCS, (M4OSA_Char *)"Temporary AU1 buffer");
79007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
79017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->m_pDataAddress1 == M4OSA_NULL )
79027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
79037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0(
79047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intAudioNullEncoding(): allocation error");
79057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_ALLOC;
79067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
79077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
79087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->m_pReaderDataIt->m_pFctGetNextAu(pC->pReaderContext,
79097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_StreamHandler *)pC->pReaderAudioStream,
79107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &pC->ReaderAudioAU1);
79117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
79127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4WAR_NO_MORE_AU == err )
79137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
79147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE2_0(
79157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intAudioNullEncoding():\
79167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     m_pReaderDataIt->m_pFctGetNextAu(audio) returns M4WAR_NO_MORE_AU");
79177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* The audio transcoding is finished */
79187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->AudioState = M4MCS_kStreamState_FINISHED;
79197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
79207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
79217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if( M4NO_ERROR != err )
79227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
79237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
79247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intAudioNullEncoding(): \
79257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    m_pReaderDataIt->m_pFctGetNextAu(Audio) returns 0x%x",
79267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
79277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
79287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
79297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*FB 2009.04.02: PR surnxp#616: Crash in MCS while Audio AU copying ,
79307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             constant memory reader case*/
79317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->ReaderAudioAU1.m_maxsize
79327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        > pC->pReaderAudioStream->m_basicProperties.m_maxAUSize )
79337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
79347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Constant memory reader case, we need to reallocate the temporary buffers */
79357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4MCS_intReallocTemporaryAU((M4OSA_MemAddr8
79367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *) &(pC->m_pDataAddress1), pC->ReaderAudioAU1.m_maxsize);
79377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* pC->m_pDataAddress1 and
79387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->m_pDataAddress2 must be reallocated at the same time */
79397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* because pC->pReaderAudioStream->m_basicProperties.m_maxAUSize take
79407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 maximum value. Then the test "if(pC->ReaderAudioAU?.m_maxsize >
79417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                  pC->pReaderAudioStream->m_basicProperties.m_maxAUSize)" is never true */
79427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* and the size of the second buffer is never changed. */
79437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4MCS_intReallocTemporaryAU((M4OSA_MemAddr8
79447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *) &(pC->m_pDataAddress2), pC->ReaderAudioAU1.m_maxsize);
79457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* pC->m_pDataAddress1 and
79467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->m_pDataAddress2 must be reallocated at the same time */
79477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Update stream properties */
79487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pReaderAudioStream->m_basicProperties.m_maxAUSize =
79497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ReaderAudioAU1.m_maxsize;
79507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
79517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**/
795232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            memcpy((void *)pC->m_pDataAddress1,
795332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                (void *)pC->ReaderAudioAU1.m_dataAddress,
79547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderAudioAU1.m_size);
79557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
79567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
79577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->ReaderAudioAU2.m_structSize == 0 )
79587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
79597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
79607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Initializes an access Unit */
79617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->m_pReader->m_pFctFillAuStruct(pC->pReaderContext,
79627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_StreamHandler *)pC->pReaderAudioStream,
79637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &pC->ReaderAudioAU2);
79647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
79657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
79667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
79677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
79687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_open(): m_pReader->m_pFctFillAuStruct(audio) returns 0x%x",
79697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
79707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
79717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
79727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_pDataAddress2 =
7973694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pC->ReaderAudioAU2.m_maxsize,
79747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4MCS, (M4OSA_Char *)"Temporary AU buffer");
79757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
79767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->m_pDataAddress2 == M4OSA_NULL )
79777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
79787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0(
79797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intAudioNullEncoding(): allocation error");
79807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4ERR_ALLOC;
79817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
79827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
79837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
79847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Read the next audio AU in the input file */
79857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->ReaderAudioAU2.m_CTS > pC->ReaderAudioAU1.m_CTS )
79867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
798732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            memcpy((void *) &pC->ReaderAudioAU,
798832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                (void *) &pC->ReaderAudioAU2, sizeof(M4_AccessUnit));
79897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->m_pReaderDataIt->m_pFctGetNextAu(pC->pReaderContext,
79907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_StreamHandler *)pC->pReaderAudioStream,
79917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &pC->ReaderAudioAU1);
79927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
79937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->ReaderAudioAU1.m_maxsize
79947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                > pC->pReaderAudioStream->m_basicProperties.m_maxAUSize )
79957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
79967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Constant memory reader case, we need to reallocate the temporary buffers */
79977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4MCS_intReallocTemporaryAU((M4OSA_MemAddr8
79987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *) &(pC->m_pDataAddress1), pC->ReaderAudioAU1.m_maxsize);
79997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /*   pC->m_pDataAddress1
80007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * and pC->m_pDataAddress2 must be reallocated at the same time *
80017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * because pC->pReaderAudioStream->m_basicProperties.m_maxAUSize take
80027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * maximum value. Then the test "if(pC->ReaderAudioAU?.m_maxsize >
80037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * pC->pReaderAudioStream->m_basicProperties.m_maxAUSize)" is never true *
80047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * and the size of the second buffer is never changed.
80057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 */
80067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4MCS_intReallocTemporaryAU((M4OSA_MemAddr8
80077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *) &(pC->m_pDataAddress2), pC->ReaderAudioAU1.m_maxsize);
80087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* pC->m_pDataAddress1 and
80097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * pC->m_pDataAddress2 must be reallocated at the same time
80107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * Update stream properties
80117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 */
80127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pReaderAudioStream->m_basicProperties.m_maxAUSize =
80137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ReaderAudioAU1.m_maxsize;
80147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
80157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**/
801632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            memcpy((void *)pC->m_pDataAddress1,
801732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                (void *)pC->ReaderAudioAU1.m_dataAddress,
80187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderAudioAU1.m_size);
80197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_audioAUDuration =
80207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderAudioAU1.m_CTS - pC->ReaderAudioAU2.m_CTS;
80217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ReaderAudioAU.m_dataAddress = pC->m_pDataAddress2;
80227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
80237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
80247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
802532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            memcpy((void *) &pC->ReaderAudioAU,
802632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                (void *) &pC->ReaderAudioAU1, sizeof(M4_AccessUnit));
80277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->m_pReaderDataIt->m_pFctGetNextAu(pC->pReaderContext,
80287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4_StreamHandler *)pC->pReaderAudioStream,
80297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &pC->ReaderAudioAU2);
80307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Crash in MCS while Audio AU copying ,
80317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             * constant memory reader case
80327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             */
80337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->ReaderAudioAU2.m_maxsize
80347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                > pC->pReaderAudioStream->m_basicProperties.m_maxAUSize )
80357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
80367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Constant memory reader case, we need to reallocate the temporary buffers */
80377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4MCS_intReallocTemporaryAU((M4OSA_MemAddr8
80387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *) &(pC->m_pDataAddress2), pC->ReaderAudioAU2.m_maxsize);
80397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* pC->m_pDataAddress1 and
80407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * pC->m_pDataAddress2 must be reallocated at the same time
80417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * because pC->pReaderAudioStream->m_basicProperties.m_maxAUSize take maximum
80427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * value. Then the test "if(pC->ReaderAudioAU?.m_maxsize > pC->pReaderAudioStream->
80437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * m_basicProperties.m_maxAUSize)" is never true
80447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 * and the size of the second buffer is never changed.
80457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 */
80467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4MCS_intReallocTemporaryAU((M4OSA_MemAddr8
80477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *) &(pC->m_pDataAddress1), pC->ReaderAudioAU2.m_maxsize);
80487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* [ END ] 20091008  JFV PR fix surnxpsw#1071: pC->m_pDataAddress1 and
80497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 pC->m_pDataAddress2 must be reallocated at the same time */
80507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Update stream properties */
80517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pReaderAudioStream->m_basicProperties.m_maxAUSize =
80527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ReaderAudioAU2.m_maxsize;
80537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
80547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**/
805532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            memcpy((void *)pC->m_pDataAddress2,
805632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                (void *)pC->ReaderAudioAU2.m_dataAddress,
80577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderAudioAU2.m_size);
80587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_audioAUDuration =
80597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderAudioAU2.m_CTS - pC->ReaderAudioAU1.m_CTS;
80607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ReaderAudioAU.m_dataAddress = pC->m_pDataAddress1;
80617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
80627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
80637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4WAR_NO_MORE_AU == err )
80647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
80657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE2_0(
80667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intAudioNullEncoding(): \
80677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_pReaderDataIt->m_pFctGetNextAu(audio) returns M4WAR_NO_MORE_AU");
80687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* The audio transcoding is finished */
80697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->AudioState = M4MCS_kStreamState_FINISHED;
80707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
80717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
80727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else if( M4NO_ERROR != err )
80737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
80747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
80757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intAudioNullEncoding(): \
80767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_pReaderDataIt->m_pFctGetNextAu(Audio) returns 0x%x",
80777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
80787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
80797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
80807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
80817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
80827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
80837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Prepare the writer AU */
80847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->pWriterDataFcts->pStartAU(pC->pWriterContext,
80857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4MCS_WRITER_AUDIO_STREAM_ID, &pC->WriterAudioAU);
80867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
80877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
80887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
80897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
80907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intAudioNullEncoding(): pWriterDataFcts->pStartAU(Audio) returns 0x%x",
80917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
80927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
80937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
80947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
80957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->uiAudioAUCount
80967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        == 0 ) /* If it is the first AU, we set it to silence
80977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (else, errors 0x3841, 0x3847 in our AAC decoder) */
80987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
80997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->InputFileProperties.AudioStreamType == M4VIDEOEDITING_kAAC
81007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            || pC->InputFileProperties.AudioStreamType
81017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == M4VIDEOEDITING_kAACplus
81027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            || pC->InputFileProperties.AudioStreamType
81037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == M4VIDEOEDITING_keAACplus )
81047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
81057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->InputFileProperties.uiNbChannels == 1 )
81067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
81077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterAudioAU.size = M4VSS3GPP_AAC_AU_SILENCE_MONO_SIZE;
810832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                memcpy((void *)pC->WriterAudioAU.dataAddress,
810932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    (void *)M4VSS3GPP_AAC_AU_SILENCE_MONO,
81107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->WriterAudioAU.size);
81117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
81127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if( pC->InputFileProperties.uiNbChannels == 2 )
81137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
81147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterAudioAU.size = M4VSS3GPP_AAC_AU_SILENCE_STEREO_SIZE;
811532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                memcpy((void *)pC->WriterAudioAU.dataAddress,
811632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    (void *)M4VSS3GPP_AAC_AU_SILENCE_STEREO,
81177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->WriterAudioAU.size);
81187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
81197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
81207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
81217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Must never happen ...*/
81227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_0(
81237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intAudioNullEncoding: Bad number of channels in audio input");
81247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4MCS_ERR_INVALID_INPUT_FILE;
81257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
81267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
81277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else if( pC->InputFileProperties.AudioStreamType
81287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == M4VIDEOEDITING_kAMR_NB )
81297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
81307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->WriterAudioAU.size = M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE;
813132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            memcpy((void *)pC->WriterAudioAU.dataAddress,
813232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                (void *)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048,
81337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterAudioAU.size);
81347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Some remaining AMR AU needs to be copied */
81357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->ReaderAudioAU.m_size != 0 )
81367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
81377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Update Writer AU */
81387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterAudioAU.size += pC->ReaderAudioAU.m_size;
813932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                memcpy((void *)(pC->WriterAudioAU.dataAddress
814032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    + M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE),
814132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    (void *)pC->ReaderAudioAU.m_dataAddress,
81427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ReaderAudioAU.m_size);
81437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
81447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
81457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
81467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
81477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*MP3 case: copy the AU*/
81487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE3_1(
81497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intAudioNullEncoding(): Copying audio AU: size=%d",
81507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderAudioAU.m_size);
815132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            memcpy((void *)pC->WriterAudioAU.dataAddress,
815232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                (void *)pC->ReaderAudioAU.m_dataAddress,
81537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderAudioAU.m_size);
81547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->WriterAudioAU.size = pC->ReaderAudioAU.m_size;
81557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
81567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
81577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
81587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
81597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
81607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Copy audio data from reader AU to writer AU */
81617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE3_1(
81627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intAudioNullEncoding(): Copying audio AU: size=%d",
81637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ReaderAudioAU.m_size);
816432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)pC->WriterAudioAU.dataAddress,
816532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *)pC->ReaderAudioAU.m_dataAddress,
81667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ReaderAudioAU.m_size);
81677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.size = pC->ReaderAudioAU.m_size;
81687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
81697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
81707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
81717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Convert CTS unit from milliseconds to timescale */
81727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->WriterAudioAU.CTS =
81737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_Time)((( pC->ReaderAudioAU.m_CTS - pC->iAudioCtsOffset)
81747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * (pC->WriterAudioStream.timeScale / 1000.0)));
81757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
81767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->InputFileProperties.AudioStreamType == M4VIDEOEDITING_kAMR_NB
81777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && pC->uiAudioAUCount == 0 )
81787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
81797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->iAudioCtsOffset -=
81807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            20; /* Duration of a silence AMR AU, to handle the duration of the added
81817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                silence frame */
81827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
81837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->WriterAudioAU.nbFrag = 0;
81847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_1("M4MCS_intAudioNullEncoding(): audio AU: CTS=%d ms",
81857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.CTS);
81867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
81877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
81887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Write it to the output file */
81897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiAudioAUCount++;
81907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->pWriterDataFcts->pProcessAU(pC->pWriterContext,
81917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4MCS_WRITER_AUDIO_STREAM_ID, &pC->WriterAudioAU);
81927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
81937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
81947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
81957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
81967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intAudioNullEncoding(): pWriterDataFcts->pProcessAU(Audio) returns 0x%x",
81977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
81987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
81997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
82007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* All the audio has been written */
82027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->ReaderAudioAU.m_size = 0;
82037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
82057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
82067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_intAudioNullEncoding(): returning M4NO_ERROR");
82077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
82087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
82097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
82117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
82127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Init Audio Transcoding
82137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR:         No error
82147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
82157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
82167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intAudioTranscoding( M4MCS_InternalContext *pC )
82177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
82187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;                        /**< General error */
82197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32
82217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiBytesDec; /**< Nb of bytes available in the decoder OUT buffer */
82227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32
82237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiDecoder2Ssrc_NbBytes; /**< Nb of bytes copied into the ssrc IN buffer */
82247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int ssrcErr;                          /**< Error while ssrc processing */
82267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 uiSsrcInSize; /**< Size in bytes of ssrc intput buffer */
82277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32
82287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiSsrcInRoom; /**< Nb of bytes available in the ssrc IN buffer */
82297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_MemAddr8
82307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pSsrcInput; /**< Pointer to the good buffer location for ssrc input */
82317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 uiSsrcOutSize; /**< Size in bytes of ssrc output buffer */
82327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32
82337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiBytesSsrc; /**< Nb of bytes available in the ssrc OUT buffer */
82347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt8
82367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        needChannelConversion; /**< Flag to indicate if a stereo <-> mono conversion is needed */
82377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32
82387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiChannelConvertorCoeff; /**< Multiplicative coefficient if stereo
82397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                    <-> mono conversion is applied */
82407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_MemAddr8 pChannelConvertorInput =
82417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_NULL; /**< Pointer to the good buffer location for channel convertor input */
82427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 uiChannelConvertorNbSamples =
82437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        0; /**< Nb of pcm samples to convert in channel convertor */
82447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_MemAddr8 pChannelConvertorOutput =
82457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_NULL; /**< Pointer to the good buffer location for channel convertor output */
82467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Time
82487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        frameTimeDelta; /**< Duration of the encoded (then written) data */
82497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32
82507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiEncoderInRoom; /**< Nb of bytes available in the encoder IN buffer */
82517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32
82527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiSsrc2Encoder_NbBytes; /**< Nb of bytes copied from the ssrc OUT buffer */
82537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_MemAddr8
82547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pEncoderInput; /**< Pointer to the good buffer location for encoder input */
82557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_AudioBuffer pEncInBuffer;   /**< Encoder input buffer for api */
82567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_AudioBuffer pEncOutBuffer;  /**< Encoder output buffer for api */
82577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int16 *tempBuffOut = M4OSA_NULL;
82597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*FlB 2009.03.04: apply audio effects if an effect is active*/
82607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int8 *pActiveEffectNumber = &(pC->pActiveEffectNumber);
82617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8262bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    uint32_t errCode = M4NO_ERROR;
8263bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
82647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->noaudio )
82657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
82667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* _________________ */
82687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|                 |*/
82697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*| READ AND DECODE |*/
82707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|_________________|*/
82717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check if we have to empty the decoder out buffer first */
82737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pPosInDecBufferOut )
82747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
82757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        goto m4mcs_intaudiotranscoding_feed_resampler;
82767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
82777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->m_pAudioDecoder->m_pFctStepAudioDec(pC->pAudioDecCtxt,
8279bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        M4OSA_NULL, &pC->AudioDecBufferOut, M4OSA_FALSE);
8280bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
82817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
82837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
82847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
82857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intAudioTranscoding(): m_pAudioDecoder->m_pFctStepAudio returns 0x%x",
82867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
82877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
82887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
82897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef MCS_DUMP_PCM_TO_FILE
82917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    fwrite(pC->AudioDecBufferOut.m_dataAddress,
82937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->AudioDecBufferOut.m_bufferSize, 1, file_pcm_decoder);
82947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
82957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
82967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8297bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    pC->m_pAudioDecoder->m_pFctGetOptionAudioDec(pC->pAudioDecCtxt,
8298bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury           M4AD_kOptionID_GetAudioAUErrCode, (M4OSA_DataOption) &errCode);
82997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8300bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    if ( M4WAR_NO_MORE_AU == errCode ) {
8301bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        pC->AudioState = M4MCS_kStreamState_FINISHED;
8302bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            M4OSA_TRACE2_0(
8303bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury                "M4MCS_intAudioTranscoding():\
8304bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury                 m_pReaderDataIt->m_pFctGetNextAu(audio) returns M4WAR_NO_MORE_AU");
8305bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            return errCode;
8306bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury   }
83077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Set the current position in the decoder out buffer */
83097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInDecBufferOut = pC->AudioDecBufferOut.m_dataAddress;
83107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ________________ */
83127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|                |*/
83137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*| FEED RESAMPLER |*/
83147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|________________|*/
83157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargim4mcs_intaudiotranscoding_feed_resampler:
83177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check if we have to empty the ssrc out buffer first */
83197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pPosInSsrcBufferOut )
83207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
83217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        goto m4mcs_intaudiotranscoding_prepare_input_buffer;
83227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
83237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Compute number of bytes remaining in the decoder buffer */
83257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uiSsrcInSize = pC->iSsrcNbSamplIn * sizeof(short)
83267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * pC->pReaderAudioStream->m_nbChannels;
83277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uiBytesDec = ( pC->AudioDecBufferOut.m_dataAddress
83287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        + pC->AudioDecBufferOut.m_bufferSize) - pC->pPosInDecBufferOut;
83297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check if we can feed directly the Ssrc with the decoder out buffer */
83317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->pPosInSsrcBufferIn == pC->pSsrcBufferIn)
83327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (uiBytesDec >= uiSsrcInSize) )
83337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
83347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pSsrcInput = pC->pPosInDecBufferOut;
83357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* update data consumed into decoder buffer after resampling */
83377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( uiBytesDec == uiSsrcInSize )
83387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pPosInDecBufferOut = M4OSA_NULL;
83397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
83407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pPosInDecBufferOut += uiSsrcInSize;
83417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        goto m4mcs_intaudiotranscoding_do_resampling;
83437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
83447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
83467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Compute remaining space in Ssrc buffer in */
83477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uiSsrcInRoom = ( pC->pSsrcBufferIn + uiSsrcInSize) - pC->pPosInSsrcBufferIn;
83487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
83507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Nb of bytes copied is the minimum between nb of bytes remaining in
83517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * decoder out buffer and space remaining in ssrc in buffer */
83527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uiDecoder2Ssrc_NbBytes =
83537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (uiSsrcInRoom < uiBytesDec) ? uiSsrcInRoom : uiBytesDec;
83547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
83567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Copy from the decoder out buffer into the Ssrc in buffer */
835732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu    memcpy((void *)pC->pPosInSsrcBufferIn, (void *)pC->pPosInDecBufferOut,
83587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiDecoder2Ssrc_NbBytes);
83597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
83617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Update the position in the decoder out buffer */
83627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInDecBufferOut += uiDecoder2Ssrc_NbBytes;
83637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
83657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Update the position in the Ssrc in buffer */
83667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInSsrcBufferIn += uiDecoder2Ssrc_NbBytes;
83677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
83697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check if the decoder buffer out is empty */
83707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->pPosInDecBufferOut - pC->AudioDecBufferOut.m_dataAddress)
83717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        == (M4OSA_Int32)pC->AudioDecBufferOut.m_bufferSize )
83727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
83737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInDecBufferOut = M4OSA_NULL;
83747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
83757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check if the Ssrc in buffer is ready (= full) */
83777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->pPosInSsrcBufferIn - pC->pSsrcBufferIn)
83787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        < (M4OSA_Int32)uiSsrcInSize )
83797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
83807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        goto m4mcs_intaudiotranscoding_end;
83817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
83827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pSsrcInput = pC->pSsrcBufferIn;
83847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* update data consumed into ssrc buffer in after resampling (empty) */
83867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInSsrcBufferIn = pC->pSsrcBufferIn;
83877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ___________________ */
83897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|                   |*/
83907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*| DO THE RESAMPLING |*/
83917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|___________________|*/
83927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargim4mcs_intaudiotranscoding_do_resampling:
83947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
83967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * No need for memcopy, we can feed Ssrc directly with the data in the audio
83977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    decoder out buffer*/
83987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
83997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    ssrcErr = 0;
84007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->pReaderAudioStream->m_nbChannels == 1 )
84027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
84037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        tempBuffOut =
8404694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            (short *)M4OSA_32bitAlignedMalloc((pC->iSsrcNbSamplOut * sizeof(short) * 2
84057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * ((*pC).InputFileProperties).uiNbChannels),
84067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4VSS3GPP,(M4OSA_Char *) "tempBuffOut");
840732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memset((void *)tempBuffOut, 0,(pC->iSsrcNbSamplOut * sizeof(short) * 2
840832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            * ((*pC).InputFileProperties).uiNbChannels));
84097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LVAudioresample_LowQuality((short *)tempBuffOut, (short *)pSsrcInput,
8411100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru            pC->iSsrcNbSamplOut, pC->pLVAudioResampler);
84127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
84137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
84147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
841532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memset((void *)pC->pSsrcBufferOut, 0, (pC->iSsrcNbSamplOut * sizeof(short)
841632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            * ((*pC).InputFileProperties).uiNbChannels));
84177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LVAudioresample_LowQuality((short *)pC->pSsrcBufferOut,
8419100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru            (short *)pSsrcInput, pC->iSsrcNbSamplOut, pC->pLVAudioResampler);
84207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
84217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->pReaderAudioStream->m_nbChannels == 1 )
84237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
84247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        From2iToMono_16((short *)tempBuffOut, (short *)pC->pSsrcBufferOut,
84257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (short)pC->iSsrcNbSamplOut);
8426694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(tempBuffOut);
84277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
84287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( 0 != ssrcErr )
84317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
84327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
84337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intAudioTranscoding: SSRC_Process returns 0x%x, \
84347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            returning M4MCS_ERR_AUDIO_CONVERSION_FAILED",
84357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ssrcErr);
84367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_ERR_AUDIO_CONVERSION_FAILED;
84377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
84387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInSsrcBufferOut = pC->pSsrcBufferOut;
84407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ______________________ */
84427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|                      |*/
84437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*| PREPARE INPUT BUFFER |*/
84447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|______________________|*/
84457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargim4mcs_intaudiotranscoding_prepare_input_buffer:
84477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Set the flag for channel conversion requirement */
84497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->AudioEncParams.ChannelNum == M4ENCODER_kMono)
84507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->pReaderAudioStream->m_nbChannels == 2) )
84517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
84527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        needChannelConversion = 1;
84537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiChannelConvertorCoeff = 4;
84547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
84557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( ( pC->AudioEncParams.ChannelNum == M4ENCODER_kStereo)
84567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->pReaderAudioStream->m_nbChannels == 1) )
84577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
84587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        needChannelConversion = 2;
84597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiChannelConvertorCoeff = 1;
84607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
84617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
84627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
84637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        needChannelConversion = 0;
84647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiChannelConvertorCoeff = 2;
84657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
84667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Compute number of bytes remaining in the Ssrc buffer */
84687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uiSsrcOutSize = pC->iSsrcNbSamplOut * sizeof(short)
84697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * pC->pReaderAudioStream->m_nbChannels;
84707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uiBytesSsrc =
84717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ( pC->pSsrcBufferOut + uiSsrcOutSize) - pC->pPosInSsrcBufferOut;
84727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check if the ssrc buffer is full */
84747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->pPosInSsrcBufferOut == pC->pSsrcBufferOut )
84757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
84767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiSsrc2Encoder_NbBytes =
84777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->audioEncoderGranularity * uiChannelConvertorCoeff / 2;
84787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Check if we can feed directly the encoder with the ssrc out buffer */
84807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( pC->pPosInAudioEncoderBuffer == M4OSA_NULL)
84817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            && (uiBytesSsrc >= uiSsrc2Encoder_NbBytes) )
84827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
84837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* update position in ssrc out buffer after encoding */
84847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( uiBytesSsrc == uiSsrc2Encoder_NbBytes )
84857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pPosInSsrcBufferOut = M4OSA_NULL;
84867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
84877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pPosInSsrcBufferOut += uiSsrc2Encoder_NbBytes;
84887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* mark the encoder buffer ready (= full) */
84907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pPosInAudioEncoderBuffer =
84917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pAudioEncoderBuffer + pC->audioEncoderGranularity;
84927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( needChannelConversion > 0 )
84947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
84957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* channel convertor writes directly into encoder buffer */
84967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pEncoderInput = pC->pAudioEncoderBuffer;
84977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
84987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pChannelConvertorInput = pC->pSsrcBufferOut;
84997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pChannelConvertorOutput = pC->pAudioEncoderBuffer;
85007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                uiChannelConvertorNbSamples =
85017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiSsrc2Encoder_NbBytes / sizeof(short);
85027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto m4mcs_intaudiotranscoding_channel_convertor;
85047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
85057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
85067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
85077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* encode directly from ssrc out buffer */
85087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pEncoderInput = pC->pSsrcBufferOut;
85097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                goto m4mcs_intaudiotranscoding_encode_and_write;
85117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
85127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
85137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
85147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
85167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Compute remaining space in encoder buffer in */
85177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->pPosInAudioEncoderBuffer == M4OSA_NULL )
85187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
85197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInAudioEncoderBuffer = pC->pAudioEncoderBuffer;
85207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
85217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uiEncoderInRoom = ( pC->pAudioEncoderBuffer + pC->audioEncoderGranularity)
85237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        - pC->pPosInAudioEncoderBuffer;
85247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncoderInput = pC->pAudioEncoderBuffer;
85257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
85277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Nb of bytes copied is the minimum between nb of bytes remaining in
85287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * decoder out buffer and space remaining in ssrc in buffer */
85297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uiSsrc2Encoder_NbBytes =
85307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (( uiEncoderInRoom * uiChannelConvertorCoeff / 2) < uiBytesSsrc)
85317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ? (uiEncoderInRoom * uiChannelConvertorCoeff / 2) : uiBytesSsrc;
85327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( needChannelConversion > 0 )
85347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
85357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* channel convertor writes directly into encoder buffer */
85367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pChannelConvertorInput = pC->pPosInSsrcBufferOut;
85377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pChannelConvertorOutput = pC->pPosInAudioEncoderBuffer;
85387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiChannelConvertorNbSamples = uiSsrc2Encoder_NbBytes / sizeof(short);
85397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
85407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
85417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
85427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* copy from the ssrc out buffer into the encoder in buffer */
854332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)pC->pPosInAudioEncoderBuffer, (void *)pC->pPosInSsrcBufferOut,
85447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            uiSsrc2Encoder_NbBytes);
85457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
85467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Update position in ssrc out buffer after encoding */
85487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInSsrcBufferOut += uiSsrc2Encoder_NbBytes;
85497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Update the position in the encoder in buffer */
85517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pPosInAudioEncoderBuffer +=
85527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uiSsrc2Encoder_NbBytes * 2 / uiChannelConvertorCoeff;
85537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check if the ssrc buffer out is empty */
85557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->pPosInSsrcBufferOut - pC->pSsrcBufferOut)
85567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        == (M4OSA_Int32)uiSsrcOutSize )
85577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
85587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInSsrcBufferOut = M4OSA_NULL;
85597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
85607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* go to next statement */
85627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( needChannelConversion > 0 )
85637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        goto m4mcs_intaudiotranscoding_channel_convertor;
85647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
85657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        goto m4mcs_intaudiotranscoding_encode_and_write;
85667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* _________________ */
85687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|                 |*/
85697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*| STEREO <-> MONO |*/
85707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|_________________|*/
85717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargim4mcs_intaudiotranscoding_channel_convertor:
85737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* convert the input pcm stream to mono or to stereo */
85757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( needChannelConversion )
85767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
85777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 1: /* stereo to mono */
85787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            From2iToMono_16((short *)pChannelConvertorInput,
85797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (short *)pChannelConvertorOutput,
85807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (short)(uiChannelConvertorNbSamples / 2));
85817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
85827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 2: /* mono to stereo */
85847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            MonoTo2I_16((short *)pChannelConvertorInput,
85857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (short *)pChannelConvertorOutput,
85867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (short)uiChannelConvertorNbSamples);
85877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
85887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
85897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* __________________ */
85917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|                  |*/
85927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*| ENCODE AND WRITE |*/
85937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|__________________|*/
85947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargim4mcs_intaudiotranscoding_encode_and_write:
85967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
85977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check if the encoder in buffer is ready (= full) */
85987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( pC->pPosInAudioEncoderBuffer - pC->pAudioEncoderBuffer)
85997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        < (M4OSA_Int32)pC->audioEncoderGranularity )
86007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
86017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        goto m4mcs_intaudiotranscoding_end;
86027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
86037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* [Mono] or [Stereo interleaved] : all is in one buffer */
86057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncInBuffer.pTableBuffer[0] = pEncoderInput;
86067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncInBuffer.pTableBufferSize[0] = pC->audioEncoderGranularity;
86077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncInBuffer.pTableBuffer[1] = M4OSA_NULL;
86087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncInBuffer.pTableBufferSize[1] = 0;
86097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Time in ms from data size, because it is PCM16 samples */
86117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    frameTimeDelta =
86127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ( pEncInBuffer.pTableBufferSize[0] * uiChannelConvertorCoeff / 2)
86137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        / sizeof(short) / pC->pReaderAudioStream->m_nbChannels;
86147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
86167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Prepare the writer AU */
86177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->pWriterDataFcts->pStartAU(pC->pWriterContext,
86187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4MCS_WRITER_AUDIO_STREAM_ID, &pC->WriterAudioAU);
86197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4NO_ERROR != err )
86217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
86227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
86237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intAudioTranscoding(): pWriterDataFcts->pStartAU(Audio) returns 0x%x",
86247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
86257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
86267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
86277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*FlB 2009.03.04: apply audio effects if an effect is active*/
86297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( *pActiveEffectNumber >= 0 && *pActiveEffectNumber < pC->nbEffects )
86307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
86317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->pEffects[*pActiveEffectNumber].ExtAudioEffectFct != M4OSA_NULL )
86327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
86337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS_ExternalProgress pProgress;
8634aa382f3637a68361989d5b70e3184bddcc472d3dhongteng            M4OSA_UInt32 tempProgress = 0;
86357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pProgress.uiClipTime = (M4OSA_UInt32)pC->ReaderAudioAU.m_CTS;
86367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pProgress.uiOutputTime = ( pC->WriterAudioAU.CTS * 1000)
86387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                / pC->WriterAudioStream.timeScale;
8639aa382f3637a68361989d5b70e3184bddcc472d3dhongteng            tempProgress = ( (M4OSA_UInt32)pC->ReaderAudioAU.m_CTS
86407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                - pC->pEffects[*pActiveEffectNumber].uiStartTime
86417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                - pC->uiBeginCutTime) * 1000;
86427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pProgress.uiProgress =
8643aa382f3637a68361989d5b70e3184bddcc472d3dhongteng                (M4OSA_UInt32)(tempProgress / (M4OSA_UInt32)pC->pEffects[
86447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *pActiveEffectNumber].uiDuration);
86457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = pC->pEffects[*pActiveEffectNumber].ExtAudioEffectFct(
86477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->pEffects[*pActiveEffectNumber].pExtAudioEffectFctCtxt,
86487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_Int16 *)pEncInBuffer.pTableBuffer[0],
86497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pEncInBuffer.pTableBufferSize[0], &pProgress);
86507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( err != M4NO_ERROR )
86527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
86537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1(
86547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4MCS_intAudioTranscoding(): ExtAudioEffectFct() returns 0x%x",
86557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            err);
86567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
86577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
86587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
86597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
86607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
86627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Prepare output buffer */
86637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncOutBuffer.pTableBuffer[0] =
86647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_MemAddr8)pC->WriterAudioAU.dataAddress;
86657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pEncOutBuffer.pTableBufferSize[0] = 0;
86667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef MCS_DUMP_PCM_TO_FILE
86687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    fwrite(pEncInBuffer.pTableBuffer[0], pEncInBuffer.pTableBufferSize[0], 1,
86707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        file_pcm_encoder);
86717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
86737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_FALSE == pC->b_isRawWriter )
86757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
86767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* This allow to write PCM data to file and to encode AMR data,
86777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         when output file is not RAW */
86787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->pOutputPCMfile != M4OSA_NULL )
86797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
86807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pOsaFileWritPtr->writeData(pC->pOutputPCMfile,
86817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pEncInBuffer.pTableBuffer[0], pEncInBuffer.pTableBufferSize[0]);
86827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
86837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
86857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Encode the PCM audio */
86867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pAudioEncoderGlobalFcts->pFctStep(pC->pAudioEncCtxt,
86877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pEncInBuffer, &pEncOutBuffer);
86887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
86907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
86917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
86927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intAudioTranscoding(): pAudioEncoderGlobalFcts->pFctStep returns 0x%x",
86937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
86947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
86957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
86967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
86977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* update data consumed into encoder buffer in after encoding (empty) */
86987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInAudioEncoderBuffer = M4OSA_NULL;
86997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
87017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Set AU cts and size */
87027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.size =
87037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncOutBuffer.
87047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pTableBufferSize[0]; /**< Get the size of encoded data */
87057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.CTS += frameTimeDelta;
87067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
87087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Update duration of the encoded AU */
87097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->m_audioAUDuration =
87107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ( frameTimeDelta * 1000) / pC->WriterAudioStream.timeScale;
87117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
87137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Write the encoded AU to the output file */
87147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->uiAudioAUCount++;
87157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pWriterDataFcts->pProcessAU(pC->pWriterContext,
87167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS_WRITER_AUDIO_STREAM_ID, &pC->WriterAudioAU);
87177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
87197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
87207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
87217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intAudioTranscoding(): pWriterDataFcts->pProcessAU(Audio) returns 0x%x",
87227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
87237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
87247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
87257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
87267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
87277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
87287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* update data consumed into encoder buffer in after encoding (empty) */
87297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pPosInAudioEncoderBuffer = M4OSA_NULL;
87307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.dataAddress =
87327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_MemAddr32)
87337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pEncoderInput; /* will be converted back to u8* in file write */
87347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->WriterAudioAU.size = pC->audioEncoderGranularity;
87357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->uiAudioAUCount++;
87367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pWriterDataFcts->pProcessAU(pC->pWriterContext,
87387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS_WRITER_AUDIO_STREAM_ID, &pC->WriterAudioAU);
87397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
87417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
87427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
87437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intAudioTranscoding(): pWriterDataFcts->pProcessAU(Audio) returns 0x%x",
87447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
87457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
87467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
87477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
87487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* _______________ */
87507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|               |*/
87517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*| ONE PASS DONE |*/
87527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*|_______________|*/
87537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargim4mcs_intaudiotranscoding_end:
87557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
87577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
87587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_intAudioTranscoding(): returning M4NO_ERROR");
87597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
87607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
87617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
87637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
87647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intReallocTemporaryAU(M4OSA_MemAddr8* addr, M4OSA_UInt32 newSize)
87657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Used only in case of 3GP constant memory reader, to be able to realloc temporary AU
87667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * because max AU size can be reevaluated during reading
87677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR:         No error
87687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
87697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
87707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intReallocTemporaryAU( M4OSA_MemAddr8 *addr,
87717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                             M4OSA_UInt32 newSize )
87727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
87737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( *addr != M4OSA_NULL )
87747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
8775694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(*addr);
8776694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        *addr = (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(newSize, M4MCS,
87777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Char *)"Reallocation of temporary AU buffer");
87787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( *addr == M4OSA_NULL )
87807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
87817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
87827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
87837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
87847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
87867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
87877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
87887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
87897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
87907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intVideoNullEncoding(M4MCS_InternalContext* pC)
87917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @author   Alexis Vapillon (NXP Software Vision)
87927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR:         No error
87937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
87947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
87957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intVideoNullEncoding( M4MCS_InternalContext *pC )
87967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
87977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
87987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Duration of the AU (find the next AU duration
87997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     * to obtain a more precise video end cut)
88007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     */
88017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 videoAUDuration = 0;
88027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
88037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_MemAddr8 WritebufferAdd = M4OSA_NULL;
88047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 lastdecodedCTS = 0;
88057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_AccessUnit lReaderVideoAU; /**< Read video access unit */
88067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
88077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->novideo )
88087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
88097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
88107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* H.264 Trimming */
88117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( ( ( pC->bH264Trim == M4OSA_TRUE)
88127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->uiVideoAUCount < pC->m_pInstance->clip_sps.num_ref_frames)
88137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->uiBeginCutTime > 0))
88147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        || (( pC->uiVideoAUCount == 0) && (pC->uiBeginCutTime > 0)) )
88157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
88167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4MCS_intVideoTranscoding(pC);
88177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
88187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
88197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
88207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
88217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if((pC->bLastDecodedFrameCTS == M4OSA_FALSE) && (pC->uiBeginCutTime > 0))
88227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
88237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // StageFright encoder does prefetch, the one frame we requested will not be written until
88247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // the encoder is closed, so do it now rather than in MCS_close
88257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( M4NO_ERROR != err)
88267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            || (M4MCS_kEncoderRunning != pC->encoderState) )
88277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
88287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_2(
88297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "!!! M4MCS_intVideoNullEncoding ERROR : M4MCS_intVideoTranscoding "
88307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "returns 0x%X w/ encState=%d", err, pC->encoderState);
88317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
88327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
88337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
88347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
88357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Stop and close the encoder now to flush the frame (prefetch) */
88367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->pVideoEncoderGlobalFcts->pFctStop != M4OSA_NULL )
88377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
88387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = pC->pVideoEncoderGlobalFcts->pFctStop(pC->pViEncCtxt);
88397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
88407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
88417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
88427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
88437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "!!! M4MCS_intVideoNullEncoding ERROR : encoder stop returns 0x%X",
88447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
88457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
88467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
88477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
88487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->encoderState = M4MCS_kEncoderStopped;
88497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pVideoEncoderGlobalFcts->pFctClose(pC->pViEncCtxt);
88507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
88517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
88527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
88537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
88547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "!!! M4MCS_intVideoNullEncoding ERROR : encoder close returns 0x%X",
88557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
88567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
88577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
88587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->encoderState = M4MCS_kEncoderClosed;
88597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
88607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
88617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8862eedda3071755b2dcf851bca8bed610de18a91d01James Dong    if ((pC->EncodingVideoFormat == M4ENCODER_kNULL)
88637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        && (pC->bLastDecodedFrameCTS == M4OSA_FALSE)
8864816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng        && (pC->uiBeginCutTime > 0)) {
88657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
88667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->bLastDecodedFrameCTS = M4OSA_TRUE;
88677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pVideoDecoder->m_pFctGetOption(pC->pViDecCtxt,
88687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4DECODER_kOptionID_AVCLastDecodedFrameCTS, &lastdecodedCTS);
88697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8870816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng        if (M4NO_ERROR != err) {
88717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
88727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intVideoNullEncoding: m_pVideoDecoder->m_pFctGetOption returns 0x%x!",
88737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
88747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
88757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
8876816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng        /* Do not need video decoder any more, need to destroy it. Otherwise it
8877816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng         * will call reader function which will cause frame lost during triming,
8878816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng         * since the 3gp reader is shared between MCS and decoder.*/
8879816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng        if (M4OSA_NULL != pC->pViDecCtxt) {
8880816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng            err = pC->m_pVideoDecoder->m_pFctDestroy(pC->pViDecCtxt);
8881816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng            pC->pViDecCtxt = M4OSA_NULL;
8882816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng
8883816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng            if (M4NO_ERROR != err) {
8884816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng                M4OSA_TRACE1_1(
8885816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng                    "M4MCS_intVideoNullEncoding: decoder pFctDestroy returns 0x%x",
8886816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng                    err);
8887816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng                return err;
8888816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng            }
8889816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng        }
88907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
88917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReader->m_pFctJump(pC->pReaderContext,
88927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4_StreamHandler *)pC->pReaderVideoStream, &lastdecodedCTS);
88937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8894816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng        if (M4NO_ERROR != err) {
88957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
8896816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng                "M4MCS_intVideoNullEncoding: m_pFctJump(V) returns 0x%x!",
88977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
88987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
88997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
89007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Initializes an access Unit */
89037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReader->m_pFctFillAuStruct(pC->pReaderContext,
89057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4_StreamHandler *)pC->pReaderVideoStream, &lReaderVideoAU);
89067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8907816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng        if (M4NO_ERROR != err) {
89087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
8909816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng                "M4MCS_intVideoNullEncoding:m_pReader->m_pFctFillAuStruct(video)\
8910816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng                returns 0x%x", err);
89117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
89127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
89137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReaderDataIt->m_pFctGetNextAu(pC->pReaderContext,
89157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4_StreamHandler *)pC->pReaderVideoStream, &lReaderVideoAU);
89167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8917816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng        if (M4WAR_NO_MORE_AU == err) {
89187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE2_0(
89197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intVideoNullEncoding():\
89207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 m_pReaderDataIt->m_pFctGetNextAu(video) returns M4WAR_NO_MORE_AU");
89217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* The audio transcoding is finished */
89227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->VideoState = M4MCS_kStreamState_FINISHED;
89237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
89247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
8925816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng        else if (M4NO_ERROR != err) {
89267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
89277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intVideoNullEncoding():\
89287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 m_pReaderDataIt->m_pFctGetNextAu(video) returns 0x%x",
89297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
89307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
89317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
89327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
89347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "### [TS_CHECK] M4MCS_intVideoNullEncoding  video AU CTS: %d ",
89357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            lReaderVideoAU.m_CTS);
89367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
89397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->bLastDecodedFrameCTS = M4OSA_TRUE;
89427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Find the next AU duration to obtain a more precise video end cut*/
89457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
89467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Initializes a new AU if needed */
89477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8948816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng    if (pC->ReaderVideoAU1.m_structSize == 0) {
89497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
89507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Initializes an access Unit */
89517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReader->m_pFctFillAuStruct(pC->pReaderContext,
89527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4_StreamHandler *)pC->pReaderVideoStream,
89537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pC->ReaderVideoAU1);
89547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8955816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng        if (M4NO_ERROR != err) {
89567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
89577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_open(): m_pReader->m_pFctFillAuStruct(video) returns 0x%x",
89587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
89597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
89607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
89617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->m_pDataVideoAddress1 =
8963694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pC->ReaderVideoAU1.m_maxsize, M4MCS,
89647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Char *)"Temporary video AU1 buffer");
89657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
8966816cd5ae8896f4965b2f1a5ea72d59dcac7257cbHong Teng        if (pC->m_pDataVideoAddress1 == M4OSA_NULL) {
89677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("M4MCS_intVideoNullEncoding(): allocation error");
89687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
89697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
89707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReaderDataIt->m_pFctGetNextAu(pC->pReaderContext,
89727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4_StreamHandler *)pC->pReaderVideoStream,
89737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pC->ReaderVideoAU1);
89747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4WAR_NO_MORE_AU == err )
89767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
89777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE2_0(
89787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intVideoNullEncoding():\
89797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 m_pReaderDataIt->m_pFctGetNextAu(video) returns M4WAR_NO_MORE_AU");
89807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* The audio transcoding is finished */
89817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->VideoState = M4MCS_kStreamState_FINISHED;
89827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
89837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
89847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else if( M4NO_ERROR != err )
89857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
89867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
89877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intVideoNullEncoding(): m_pReaderDataIt->m_pFctGetNextAu(video)\
89887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 returns 0x%x", err);
89897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
89907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
89917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
89927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->ReaderVideoAU1.m_maxsize
89937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            > pC->pReaderVideoStream->m_basicProperties.m_maxAUSize )
89947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
89957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Constant memory reader case, we need to reallocate the temporary buffers */
89967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS_intReallocTemporaryAU((M4OSA_MemAddr8
89977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *) &(pC->m_pDataVideoAddress1), pC->ReaderVideoAU1.m_maxsize);
89987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* pC->m_pDataVideoAddress1
89997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            and pC->m_pDataVideoAddress2 must be reallocated at the same time */
90007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* because pC->pReaderVideoStream->m_basicProperties.m_maxAUSize take maximum value.
90017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             Then the test "if(pC->ReaderVideoAU?.m_maxsize > pC->pReaderVideoStream->
90027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             m_basicProperties.m_maxAUSize)" is never true */
90037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* and the size of the second buffer is never changed. */
90047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS_intReallocTemporaryAU((M4OSA_MemAddr8
90057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *) &(pC->m_pDataVideoAddress2), pC->ReaderVideoAU1.m_maxsize);
90067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* pC->m_pDataVideoAddress1 and
90077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_pDataVideoAddress2 must be reallocated at the same time */
90087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Update stream properties */
90097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderVideoStream->m_basicProperties.m_maxAUSize =
90107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderVideoAU1.m_maxsize;
90117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
901232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)pC->m_pDataVideoAddress1,
901332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *)pC->ReaderVideoAU1.m_dataAddress,
90147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ReaderVideoAU1.m_size);
90157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
90167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
90177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->ReaderVideoAU2.m_structSize == 0 )
90187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
90197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
90207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Initializes an access Unit */
90217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReader->m_pFctFillAuStruct(pC->pReaderContext,
90227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4_StreamHandler *)pC->pReaderVideoStream,
90237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pC->ReaderVideoAU2);
90247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
90257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
90267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
90277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
90287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_open(): m_pReader->m_pFctFillAuStruct(video) returns 0x%x",
90297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
90307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
90317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
90327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->m_pDataVideoAddress2 =
9033694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pC->ReaderVideoAU2.m_maxsize, M4MCS,
90347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_Char *)"Temporary video AU buffer");
90357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
90367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->m_pDataVideoAddress2 == M4OSA_NULL )
90377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
90387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_0("M4MCS_intVideoNullEncoding(): allocation error");
90397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return M4ERR_ALLOC;
90407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
90417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
90427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
90437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Read the next video AU in the input file */
90447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->ReaderVideoAU2.m_CTS > pC->ReaderVideoAU1.m_CTS )
90457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
904632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *) &pC->ReaderVideoAU,
904732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *) &pC->ReaderVideoAU2, sizeof(M4_AccessUnit));
90487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReaderDataIt->m_pFctGetNextAu(pC->pReaderContext,
90497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4_StreamHandler *)pC->pReaderVideoStream,
90507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pC->ReaderVideoAU1);
90517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
90527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->ReaderVideoAU1.m_maxsize
90537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            > pC->pReaderVideoStream->m_basicProperties.m_maxAUSize )
90547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
90557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Constant memory reader case, we need to reallocate the temporary buffers */
90567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS_intReallocTemporaryAU((M4OSA_MemAddr8
90577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *) &(pC->m_pDataVideoAddress1), pC->ReaderVideoAU1.m_maxsize);
90587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* pC->m_pDataVideoAddress1 and
90597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             pC->m_pDataVideoAddress2 must be reallocated at the same time */
90607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* because pC->pReaderVideoStream->m_basicProperties.m_maxAUSize take maximum value.
90617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             Then the test "if(pC->ReaderVideoAU?.m_maxsize > pC->pReaderVideoStream->
90627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             m_basicProperties.m_maxAUSize)" is never true */
90637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* and the size of the second buffer is never changed. */
90647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS_intReallocTemporaryAU((M4OSA_MemAddr8
90657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *) &(pC->m_pDataVideoAddress2), pC->ReaderVideoAU1.m_maxsize);
90667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* pC->m_pDataVideoAddress1 and
90677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_pDataVideoAddress2 must be reallocated at the same time */
90687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Update stream properties */
90697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderVideoStream->m_basicProperties.m_maxAUSize =
90707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderVideoAU1.m_maxsize;
90717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
907232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)pC->m_pDataVideoAddress1,
907332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *)pC->ReaderVideoAU1.m_dataAddress,
90747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ReaderVideoAU1.m_size);
90757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        videoAUDuration = pC->ReaderVideoAU1.m_CTS - pC->ReaderVideoAU2.m_CTS;
90767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ReaderVideoAU.m_dataAddress = pC->m_pDataVideoAddress2;
90777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
90787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
90797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
908032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *) &pC->ReaderVideoAU,
908132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *) &pC->ReaderVideoAU1, sizeof(M4_AccessUnit));
90827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReaderDataIt->m_pFctGetNextAu(pC->pReaderContext,
90837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4_StreamHandler *)pC->pReaderVideoStream,
90847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pC->ReaderVideoAU2);
90857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
90867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->ReaderVideoAU2.m_maxsize
90877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            > pC->pReaderVideoStream->m_basicProperties.m_maxAUSize )
90887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
90897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Constant memory reader case, we need to reallocate the temporary buffers */
90907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS_intReallocTemporaryAU((M4OSA_MemAddr8
90917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *) &(pC->m_pDataVideoAddress2), pC->ReaderVideoAU2.m_maxsize);
90927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* pC->m_pDataVideoAddress1 and
90937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             pC->m_pDataVideoAddress2 must be reallocated at the same time */
90947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* because pC->pReaderVideoStream->m_basicProperties.m_maxAUSize take maximum value.
90957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             Then the test "if(pC->ReaderVideoAU?.m_maxsize > pC->pReaderVideoStream->
90967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             m_basicProperties.m_maxAUSize)" is never true */
90977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* and the size of the second buffer is never changed. */
90987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS_intReallocTemporaryAU((M4OSA_MemAddr8
90997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *) &(pC->m_pDataVideoAddress1), pC->ReaderVideoAU2.m_maxsize);
91007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* pC->m_pDataVideoAddress1 and
91017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_pDataVideoAddress2 must be reallocated at the same time */
91027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Update stream properties */
91037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderVideoStream->m_basicProperties.m_maxAUSize =
91047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderVideoAU2.m_maxsize;
91057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
910632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        memcpy((void *)pC->m_pDataVideoAddress2,
910732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu            (void *)pC->ReaderVideoAU2.m_dataAddress,
91087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->ReaderVideoAU2.m_size);
91097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        videoAUDuration = pC->ReaderVideoAU2.m_CTS - pC->ReaderVideoAU1.m_CTS;
91107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->ReaderVideoAU.m_dataAddress = pC->m_pDataVideoAddress1;
91117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
91127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
91137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4WAR_NO_MORE_AU == err )
91147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
91157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE2_0(
91167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intVideoNullEncoding():\
91177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             m_pReaderDataIt->m_pFctGetNextAu(video) returns M4WAR_NO_MORE_AU");
91187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* The video transcoding is finished */
91197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->VideoState = M4MCS_kStreamState_FINISHED;
91207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
91217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
91227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( M4NO_ERROR != err )
91237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
91247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
91257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intVideoNullEncoding(): m_pReaderDataIt->m_pFctGetNextAu(Video) returns 0x%x",
91267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
91277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
91287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
91297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
91307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
91317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
91327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Prepare the writer AU */
91337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pWriterDataFcts->pStartAU(pC->pWriterContext,
91347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS_WRITER_VIDEO_STREAM_ID, &pC->WriterVideoAU);
91357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
91367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
91377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
91387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
91397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intVideoNullEncoding(): pWriterDataFcts->pStartAU(Video) returns 0x%x",
91407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
91417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
91427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
91437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
91447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Copy video data from reader AU to writer AU */
91457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE3_1(
91467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intVideoNullEncoding(): Copying video AU: size=%d",
91477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->ReaderVideoAU.m_size);
91487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* + CRLV6775 -H.264 Trimming */
91497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4OSA_TRUE == pC->bH264Trim )
91507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
91517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->H264MCSTempBufferSize
91527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    < (pC->ReaderVideoAU.m_size + 2048) )
91537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
91547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->H264MCSTempBufferSize =
91557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (pC->ReaderVideoAU.m_size + 2048);
91567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
91577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->H264MCSTempBuffer != M4OSA_NULL )
91587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
9159694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                        free(pC->H264MCSTempBuffer);
91607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
91617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->H264MCSTempBuffer =
9162694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu                        (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc(pC->H264MCSTempBufferSize,
91637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4MCS, (M4OSA_Char *)"pC->H264MCSTempBuffer");
91647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
91657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if( pC->H264MCSTempBuffer == M4OSA_NULL )
91667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
91677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_0(
91687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            "M4MCS_intVideoNullEncoding(): allocation error");
91697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return M4ERR_ALLOC;
91707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
91717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
91727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
91737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->H264MCSTempBufferDataSize = pC->H264MCSTempBufferSize;
91747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
91757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = H264MCS_ProcessNALU(pC->m_pInstance,
91767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_UInt8 *)pC->ReaderVideoAU.m_dataAddress,
91777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ReaderVideoAU.m_size, pC->H264MCSTempBuffer,
91787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_Int32 *)&pC->H264MCSTempBufferDataSize);
91797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
91807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( pC->m_pInstance->is_done == 1 )
91817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
91827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4MCS_convetFromByteStreamtoNALStream(
91837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_UInt8 *)pC->ReaderVideoAU.m_dataAddress ,
91847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ReaderVideoAU.m_size);
91857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
918632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    memcpy((void *)pC->WriterVideoAU.dataAddress,
918732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        (void *)(pC->ReaderVideoAU.m_dataAddress + 4),
91887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->ReaderVideoAU.m_size - 4);
91897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->WriterVideoAU.size = pC->ReaderVideoAU.m_size - 4;
91907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    WritebufferAdd =
91917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_MemAddr8)pC->WriterVideoAU.dataAddress;
91927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
91937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else
91947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
919532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    memcpy((void *)pC->WriterVideoAU.dataAddress,
919632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                        (void *)(pC->H264MCSTempBuffer + 4),
91977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        pC->H264MCSTempBufferDataSize - 4);
91987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->WriterVideoAU.size = pC->H264MCSTempBufferDataSize - 4;
91997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    WritebufferAdd =
92007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        (M4OSA_MemAddr8)pC->WriterVideoAU.dataAddress;
92017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
92027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
92037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* H.264 Trimming */
92047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
92057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
920632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                memcpy((void *)pC->WriterVideoAU.dataAddress,
920732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    (void *)pC->ReaderVideoAU.m_dataAddress,
92087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->ReaderVideoAU.m_size);
92097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterVideoAU.size = pC->ReaderVideoAU.m_size;
92107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
92117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
92127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Convert CTS unit from milliseconds to timescale */
92137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->WriterVideoAU.CTS =
92147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                (M4OSA_Time)((( pC->ReaderVideoAU.m_CTS - pC->dViDecStartingCts)
92157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * (pC->WriterVideoStream.timeScale / 1000.0)));
92167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->WriterVideoAU.nbFrag = 0;
92177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->WriterVideoAU.attribute = pC->ReaderVideoAU.m_attribute;
92187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
92197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE3_1("M4MCS_intVideoNullEncoding(): video AU: CTS=%d ms",
92207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->WriterVideoAU.CTS);
92217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
92227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
92237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Write it to the output file */
92247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->uiVideoAUCount++;
92257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->pWriterDataFcts->pProcessAU(pC->pWriterContext,
92267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS_WRITER_VIDEO_STREAM_ID, &pC->WriterVideoAU);
92277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
92287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
92297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
92307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
92317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intVideoNullEncoding(): pWriterDataFcts->pProcessAU(Video) returns 0x%x",
92327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
92337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return err;
92347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
92357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* + CRLV6775 -H.264 Trimming */
92367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_TRUE == pC->bH264Trim )
92377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
92387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->m_pInstance->is_done == 1 )
92397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
924032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                memcpy((void *)(WritebufferAdd - 4),
924132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    (void *)(pC->ReaderVideoAU.m_dataAddress), 4);
92427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
92437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
92447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
924532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                memcpy((void *)(WritebufferAdd - 4),
924632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu                    (void *)(pC->H264MCSTempBuffer), 4);
92477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
92487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } /* H.264 Trimming */
92497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
92507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
92517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check for end cut. */
92527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Bug fix 11/12/2008: We absolutely want to have less or same video duration ->
92537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    (2*videoAUDuration) to have a more precise end cut*/
92547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->ReaderVideoAU.m_CTS + (2 *videoAUDuration) > pC->uiEndCutTime )
92557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
92567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->VideoState = M4MCS_kStreamState_FINISHED;
92577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
92587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
92597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
92607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
92617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_intVideoNullEncoding(): returning M4NO_ERROR");
92627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
92637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
92647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
92657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
92667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
92677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intVideoTranscoding(M4MCS_InternalContext* pC)
92687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @author   Alexis Vapillon (NXP Software Vision)
92697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR:         No error
92707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
92717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
92727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intVideoTranscoding( M4MCS_InternalContext *pC )
92737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
92747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
92757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_MediaTime mtTranscodedTime = 0.0;
92767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ENCODER_FrameMode FrameMode;
92777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 derive = 0;
92787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
92797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
92807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Get video CTS to decode */
92817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    mtTranscodedTime = pC->dViDecCurrentCts;
92827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    FrameMode = M4ENCODER_kNormalFrame;
92837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
92847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
92857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Decode video */
92867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_1(
92877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_intVideoTranscoding(): Calling m_pVideoDecoder->m_pFctDecode(%.2f)",
92887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        mtTranscodedTime);
92897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->isRenderDup = M4OSA_FALSE;
92907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->m_pVideoDecoder->m_pFctDecode(pC->pViDecCtxt, &mtTranscodedTime,
9291b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang        M4OSA_FALSE, 0);
92927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
92937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4WAR_NO_MORE_AU == err )
92947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
92957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        FrameMode =
92967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4ENCODER_kLastFrame; /**< We will give this value to the encoder to
92977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ask for the end of the encoding */
92987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->VideoState = M4MCS_kStreamState_FINISHED;
92997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
93007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( err == M4WAR_VIDEORENDERER_NO_NEW_FRAME )
93017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
93027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE2_0("Decoding output the same frame as before 3");
93037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->isRenderDup = M4OSA_TRUE;
93047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
93057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( M4NO_ERROR != err )
93067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
93077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1(
93087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            "M4MCS_intVideoTranscoding(): m_pVideoDecoder->m_pFctDecode returns 0x%x!",
93097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err);
93107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
93117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
93127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
93137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
93147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check for end cut.
93157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * We must check here if the end cut is reached, because in that case we must
93167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * call the last encode step (-> bLastFrame set to true) */
93170e248c82803c7880a15ce29c2d4be5c2189e414cDanny Fernandes    if( ( pC->dViDecCurrentCts + pC->dCtsIncrement ) >= (pC->uiEndCutTime
93187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        + M4MCS_ABS(pC->dViDecStartingCts - pC->uiBeginCutTime)) )
93197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
93207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        FrameMode =
93217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4ENCODER_kLastFrame; /**< We will give this value to the encoder to
93227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            ask for the end of the encoding */
93237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->VideoState = M4MCS_kStreamState_FINISHED;
93247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        derive = (M4OSA_Int32)(( pC->dViDecCurrentCts + pC->dCtsIncrement + 0.5)
93257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            - (pC->uiEndCutTime
93267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            + M4MCS_ABS(pC->dViDecStartingCts - pC->uiBeginCutTime)));
93277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
93287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
93297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Update starting CTS to have a more precise value (
93307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    the begin cut is not a real CTS)*/
93317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->uiVideoAUCount == 0 )
93327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
93337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->dViDecStartingCts = mtTranscodedTime;
93347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->dViDecCurrentCts = pC->dViDecStartingCts;
93357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
93367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
93377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
93387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Encode video */
93397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_1(
93407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_intVideoTranscoding(): Calling pVideoEncoderGlobalFcts->pFctEncode with videoCts\
93417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         = %.2f",pC->ReaderVideoAU.m_CTS);
93427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->uiVideoAUCount++;
93437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* update the given duration (the begin cut is not a real CTS)*/
93447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->pVideoEncoderGlobalFcts->pFctEncode(pC->pViEncCtxt, M4OSA_NULL,
93457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (pC->dViDecCurrentCts - pC->dViDecStartingCts - (derive >> 1)),
93467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        FrameMode);
93477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
93487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return err;
93497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
93507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
93517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
93527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
93537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intGetInputClipProperties(M4MCS_InternalContext* pContext)
93547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @author   Dounya Manai (NXP Software Vision)
93557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Retrieve the properties of the audio and video streams from the input file.
93567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pContext            (IN) MCS context
93577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR:         No error
93587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4ERR_PARAMETER:    pContext is M4OSA_NULL (If Debug Level >= 2)
93597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
93607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
93617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intGetInputClipProperties( M4MCS_InternalContext *pC )
93627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
93637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4DECODER_MPEG4_DecoderConfigInfo DecConfInfo;
93647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4READER_3GP_H263Properties H263prop;
93657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
93667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 videoBitrate;
93677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4DECODER_VideoSize videoSize;
93687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_AACType iAacType = 0;
93697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
93707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
93717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
93727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == pC, M4ERR_PARAMETER,
93737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        "M4MCS_intGetInputClipProperties: pC is M4OSA_NULL");
93747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
93757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
93767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Reset common characteristics */
93777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.bAnalysed = M4OSA_FALSE;
93787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.FileType = 0;
93797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.Version[0] = M4VIDEOEDITING_VERSION_MAJOR;
93807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.Version[1] = M4VIDEOEDITING_VERSION_MINOR;
93817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.Version[2] = M4VIDEOEDITING_VERSION_REVISION;
93827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiClipDuration = 0;
93837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
938432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu    memset((void *) &pC->InputFileProperties.ftyp,
938532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu        0, sizeof(M4VIDEOEDITING_FtypBox));
93867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
93877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
93887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Reset video characteristics */
93897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.VideoStreamType = M4VIDEOEDITING_kNoneVideo;
93907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiClipVideoDuration = 0;
93917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiVideoBitrate = 0;
93927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiVideoMaxAuSize = 0;
93937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiVideoWidth = 0;
93947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiVideoHeight = 0;
93957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiVideoTimeScale = 0;
93967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.fAverageFrameRate = 0.0;
93970a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    pC->InputFileProperties.uiVideoLevel =
93980a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL;
93990a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury    pC->InputFileProperties.uiVideoProfile =
94000a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE;
94017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.bMPEG4dataPartition = M4OSA_FALSE;
94027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.bMPEG4rvlc = M4OSA_FALSE;
94037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.bMPEG4resynchMarker = M4OSA_FALSE;
94047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
94067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Reset audio characteristics */
94077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.AudioStreamType = M4VIDEOEDITING_kNoneAudio;
94087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiClipAudioDuration = 0;
94097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiAudioBitrate = 0;
94107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiAudioMaxAuSize = 0;
94117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiNbChannels = 0;
94127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiSamplingFrequency = 0;
94137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiExtendedSamplingFrequency = 0;
94147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.uiDecodedPcmSize = 0;
94157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Reset compatibility chart (not used in MCS) */
94177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.bVideoIsEditable = M4OSA_FALSE;
94187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.bAudioIsEditable = M4OSA_FALSE;
94197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.bVideoIsCompatibleWithMasterClip = M4OSA_FALSE;
94207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.bAudioIsCompatibleWithMasterClip = M4OSA_FALSE;
94217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
94237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Video stream properties */
94247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pReaderVideoStream )
94257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
94267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pC->pReaderVideoStream->m_basicProperties.m_streamType )
94277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
94287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4DA_StreamTypeVideoMpeg4:
94297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.VideoStreamType = M4VIDEOEDITING_kMPEG4;
94307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
94317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4DA_StreamTypeVideoH263:
94337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.VideoStreamType = M4VIDEOEDITING_kH263;
94347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
94357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4DA_StreamTypeVideoMpeg4Avc:
94377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.VideoStreamType = M4VIDEOEDITING_kH264;
94387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
94397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4DA_StreamTypeUnknown:
94417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            default:
94427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.VideoStreamType =
94437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4VIDEOEDITING_kUnsupportedVideo;
94447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
94457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
94467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* if bitrate not available retrieve an estimation of the overall bitrate */
94487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiVideoBitrate =
94497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderVideoStream->m_basicProperties.m_averageBitRate;
94507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( 0 == pC->InputFileProperties.uiVideoBitrate )
94527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
94537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->m_pReader->m_pFctGetOption(pC->pReaderContext,
94547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4READER_kOptionID_Bitrate, &videoBitrate);
94557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4OSA_NULL != pC->pReaderAudioStream )
94577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
94587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* we get the overall bitrate, substract the audio bitrate if any */
94597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                videoBitrate -=
94607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pReaderAudioStream->m_basicProperties.m_averageBitRate;
94617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
94627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.uiVideoBitrate = videoBitrate;
94637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
94647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
94667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Retrieve the Profile & Level */
94677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( M4VIDEOEDITING_kH263 != pC->InputFileProperties.VideoStreamType)
94687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            && (M4VIDEOEDITING_kH264
94697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            != pC->InputFileProperties.VideoStreamType) )
94707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
94717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Use the DSI parsing function from the external video shell decoder.
94727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            See the comments in M4VSS3GPP_ClipAnalysis.c, it's pretty much the
94737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            same issue. */
94747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4DECODER_EXTERNAL_ParseVideoDSI(pC->pReaderVideoStream->
94767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_basicProperties.m_pDecoderSpecificInfo,
94777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pReaderVideoStream->
94787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                m_basicProperties.m_decoderSpecificInfoSize,
94797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &DecConfInfo, &videoSize);
94807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
94827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
94837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
94847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intGetInputClipProperties():\
94857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     M4DECODER_EXTERNAL_ParseVideoDSI returns 0x%08X",
94867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
94877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
94887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
94897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderVideoStream->m_videoWidth = videoSize.m_uiWidth;
94917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderVideoStream->m_videoHeight = videoSize.m_uiHeight;
94927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.uiVideoTimeScale = DecConfInfo.uiTimeScale;
94937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.bMPEG4dataPartition =
94947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                DecConfInfo.bDataPartition;
94957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.bMPEG4rvlc = DecConfInfo.bUseOfRVLC;
94967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.bMPEG4resynchMarker =
94977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                DecConfInfo.uiUseOfResynchMarker;
94987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
94990a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            err = getMPEG4ProfileAndLevel(DecConfInfo.uiProfile,
95000a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                        &(pC->InputFileProperties.uiVideoProfile),
95010a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                        &(pC->InputFileProperties.uiVideoLevel));
95020a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            if ( M4NO_ERROR != err ) {
95030a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                M4OSA_TRACE1_1("M4MCS_intGetInputClipProperties():\
95040a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                    getMPEG4ProfileAndLevel returns 0x%08X", err);
95050a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                return err;
95067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
95077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
95080a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        else if( M4VIDEOEDITING_kH263 ==
95090a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            pC->InputFileProperties.VideoStreamType ) {
95100a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury
95110a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            err = getH263ProfileAndLevel(pC->pReaderVideoStream->
95120a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                        m_basicProperties.m_pDecoderSpecificInfo,
95130a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                        pC->pReaderVideoStream->m_basicProperties.m_decoderSpecificInfoSize,
95140a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                        &(pC->InputFileProperties.uiVideoProfile),
95150a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                        &(pC->InputFileProperties.uiVideoLevel));
95160a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            if ( M4NO_ERROR != err ) {
95170a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                M4OSA_TRACE1_1("M4MCS_intGetInputClipProperties():\
95180a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                    getH263ProfileAndLevel returns 0x%08X", err);
95197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
95207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
95217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* For h263 set default timescale : 30000:1001 */
95227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.uiVideoTimeScale = 30000;
95237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
95240a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury        else if ( M4VIDEOEDITING_kH264 ==
95250a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            pC->InputFileProperties.VideoStreamType ) {
95267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
95270a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            pC->InputFileProperties.uiVideoTimeScale = 30000;
95280a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            err = getAVCProfileAndLevel(pC->pReaderVideoStream->
95290a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                        m_basicProperties.m_pDecoderSpecificInfo,
95300a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                        pC->pReaderVideoStream->m_basicProperties.m_decoderSpecificInfoSize,
95310a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                        &(pC->InputFileProperties.uiVideoProfile),
95320a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                        &(pC->InputFileProperties.uiVideoLevel));
95330a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury            if ( M4NO_ERROR != err ) {
95340a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                M4OSA_TRACE1_1("M4MCS_intGetInputClipProperties():\
95350a25bd5bacf5408ca205b15e53cfb6dc2fc1d171Rajneesh Chowdury                    getAVCProfileAndLevel returns 0x%08X", err);
95367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
95377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
95387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
95397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
95407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Here because width x height is correct only after dsi parsing
95417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (done in create decoder) */
95427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiVideoHeight =
95437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderVideoStream->m_videoHeight;
95447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiVideoWidth =
95457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderVideoStream->m_videoWidth;
95467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiClipVideoDuration =
95477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt32)pC->pReaderVideoStream->m_basicProperties.m_duration;
95487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.fAverageFrameRate =
95497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderVideoStream->m_averageFrameRate;
95507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiVideoMaxAuSize =
95517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderVideoStream->m_basicProperties.m_maxAUSize;
9552e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury        pC->InputFileProperties.videoRotationDegrees =
9553e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury            pC->pReaderVideoStream->videoRotationDegrees;
95547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
95557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
95567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
95577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_TRUE == pC->bUnsupportedVideoFound )
95587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
95597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.VideoStreamType =
95607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4VIDEOEDITING_kUnsupportedVideo;
95617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
95627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
95637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
95647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.VideoStreamType = M4VIDEOEDITING_kNoneVideo;
95657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
95667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
95677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
95687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
95697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Audio stream properties */
95707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->pReaderAudioStream )
95717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
95727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pC->pReaderAudioStream->m_basicProperties.m_streamType )
95737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
95747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4DA_StreamTypeAudioAmrNarrowBand:
95757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.AudioStreamType =
95767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4VIDEOEDITING_kAMR_NB;
95777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
95787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
95797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4DA_StreamTypeAudioAac:
95807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.AudioStreamType = M4VIDEOEDITING_kAAC;
95817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
95827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
95837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4DA_StreamTypeAudioMp3:
95847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.AudioStreamType = M4VIDEOEDITING_kMP3;
95857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
95867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
95877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4DA_StreamTypeAudioEvrc:
95887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.AudioStreamType = M4VIDEOEDITING_kEVRC;
95897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
95907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
95917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4DA_StreamTypeUnknown:
95927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            default:
95937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.AudioStreamType =
95947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4VIDEOEDITING_kUnsupportedAudio;
95957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
95967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
95977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
95987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( ( M4OSA_NULL != pC->m_pAudioDecoder)
95997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            && (M4OSA_NULL == pC->pAudioDecCtxt) )
96007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
96017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE3_1(
96027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intGetInputClipProperties: calling CreateAudioDecoder, userData= 0x%x",
96037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->m_pCurrentAudioDecoderUserData);
96048a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury
96058a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury            if( M4OSA_FALSE == pC->bExtOMXAudDecoder ) {
96068a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                err = M4MCS_intCheckAndGetCodecProperties(pC);
96078a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury            }
96088a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury            else
96097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
96108a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                err = pC->m_pAudioDecoder->m_pFctCreateAudioDec(
96118a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    &pC->pAudioDecCtxt, pC->pReaderAudioStream,
96128a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    pC->m_pCurrentAudioDecoderUserData);
96138a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury
96148a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                if( M4NO_ERROR == err )
96157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
96168a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    /* AAC properties*/
96178a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    //get from Reader; temporary, till Audio decoder shell API available to
96188a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    //get the AAC properties
96198a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    pC->AacProperties.aNumChan =
96208a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                        pC->pReaderAudioStream->m_nbChannels;
96218a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    pC->AacProperties.aSampFreq =
96228a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                        pC->pReaderAudioStream->m_samplingFrequency;
96238a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury
96248a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    err = pC->m_pAudioDecoder->m_pFctGetOptionAudioDec(
96258a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                        pC->pAudioDecCtxt, M4AD_kOptionID_StreamType,
96268a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                        (M4OSA_DataOption) &iAacType);
96277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
96288a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    if( M4NO_ERROR != err )
96297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
96308a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                        M4OSA_TRACE1_1(
96318a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            "M4MCS_intGetInputClipProperties:\
96328a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                             m_pAudioDecoder->m_pFctGetOptionAudioDec returns err 0x%x",
96338a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            err);
96348a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                        iAacType = M4_kAAC; //set to default
96358a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                        err = M4NO_ERROR;
96368a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    }
96378a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    else
96388a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    {
96398a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                        M4OSA_TRACE3_1(
96408a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            "M4MCS_intGetInputClipProperties:\
96418a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                             m_pAudioDecoder->m_pFctGetOptionAudioDec returns streamType %d",
96428a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            iAacType);
96438a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    }
96447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
96458a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    switch( iAacType )
96468a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    {
96478a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                        case M4_kAAC:
96488a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            pC->AacProperties.aSBRPresent = 0;
96498a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            pC->AacProperties.aPSPresent = 0;
96508a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            break;
96517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
96528a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                        case M4_kAACplus:
96538a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            pC->AacProperties.aSBRPresent = 1;
96548a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            pC->AacProperties.aPSPresent = 0;
96558a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            pC->AacProperties.aExtensionSampFreq =
96568a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                                pC->pReaderAudioStream->
96578a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                                m_samplingFrequency; //TODO
96588a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            break;
96597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
96608a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                        case M4_keAACplus:
96618a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            pC->AacProperties.aSBRPresent = 1;
96628a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            pC->AacProperties.aPSPresent = 1;
96638a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            pC->AacProperties.aExtensionSampFreq =
96648a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                                pC->pReaderAudioStream->
96658a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                                m_samplingFrequency; //TODO
96668a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            break;
96678a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                          case M4_kUnknown:
96688a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                          break;
96698a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                          default:
96708a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                          break;
96718a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                        }
96728a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                        M4OSA_TRACE3_2(
96738a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            "M4MCS_intGetInputClipProperties: AAC NBChans=%d, SamplFreq=%d",
96748a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            pC->AacProperties.aNumChan,
96758a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                            pC->AacProperties.aSampFreq);
96767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
96777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
96787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
96797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4NO_ERROR != err )
96807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
96817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_TRACE1_1(
96827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    "M4MCS_intGetInputClipProperties:\
96837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     m_pAudioDecoder->m_pFctCreateAudioDec returns 0x%x",
96847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err);
96857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return err;
96867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
96877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
96887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
96897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //EVRC
96907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( pC->pReaderAudioStream->m_basicProperties.m_streamType
96917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == M4DA_StreamTypeAudioEvrc )
96927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
96937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* decoder not implemented yet, provide some default values for the null encoding */
96947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderAudioStream->m_nbChannels = 1;
96957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderAudioStream->m_samplingFrequency = 8000;
96967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
96977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
96987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
96997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * Bugfix P4ME00001128: With some IMTC files, the AMR bit rate is 0 kbps according
97007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         the GetProperties function */
97017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( 0 == pC->pReaderAudioStream->m_basicProperties.m_averageBitRate )
97027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
97037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( M4VIDEOEDITING_kAMR_NB
97047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                == pC->InputFileProperties.AudioStreamType )
97057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
97067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
97077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Better returning a guessed 12.2 kbps value than a sure-to-be-false
97087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                0 kbps value! */
97097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.uiAudioBitrate =
97107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4VIDEOEDITING_k12_2_KBPS;
97117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
97127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if( M4VIDEOEDITING_kEVRC
97137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                == pC->InputFileProperties.AudioStreamType )
97147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
97157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /**
97167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                * Better returning a guessed 8.5 kbps value than a sure-to-be-false
97177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                0 kbps value! */
97187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.uiAudioBitrate =
97197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4VIDEOEDITING_k9_2_KBPS;
97207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
97217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
97227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
97237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4OSA_UInt32 FileBitrate;
97247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
97257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Can happen also for aac, in this case we calculate an approximative */
97267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* value from global bitrate and video bitrate */
97277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err = pC->m_pReader->m_pFctGetOption(pC->pReaderContext,
97287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4READER_kOptionID_Bitrate,
97297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4OSA_DataOption) &FileBitrate);
97307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
97317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if( M4NO_ERROR != err )
97327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
97337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1(
97347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        "M4MCS_intGetInputClipProperties: M4READER_kOptionID_Bitrate returns 0x%x",
97357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        err);
97367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    return err;
97377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
97387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.uiAudioBitrate =
97397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    FileBitrate
97407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    - pC->
97417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    InputFileProperties.
97427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    uiVideoBitrate /* normally setted to 0, if no video */;
97437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
97447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
97457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
97467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
97477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.uiAudioBitrate =
97487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->pReaderAudioStream->m_basicProperties.m_averageBitRate;
97497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
97507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
97517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiNbChannels =
97527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderAudioStream->m_nbChannels;
97537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiSamplingFrequency =
97547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderAudioStream->m_samplingFrequency;
97557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiClipAudioDuration =
97567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            (M4OSA_UInt32)pC->pReaderAudioStream->m_basicProperties.m_duration;
97577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiAudioMaxAuSize =
97587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderAudioStream->m_basicProperties.m_maxAUSize;
97597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
97607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Bug: with aac, value is 0 until decoder start() is called */
97617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiDecodedPcmSize =
97627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderAudioStream->m_byteFrameLength
97637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * pC->pReaderAudioStream->m_byteSampleSize
97647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * pC->pReaderAudioStream->m_nbChannels;
97657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
97667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* New aac properties */
97677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4DA_StreamTypeAudioAac
97687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            == pC->pReaderAudioStream->m_basicProperties.m_streamType )
97697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
97707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.uiNbChannels = pC->AacProperties.aNumChan;
97717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.uiSamplingFrequency =
97727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->AacProperties.aSampFreq;
97737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
97747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->AacProperties.aSBRPresent )
97757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
97767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.AudioStreamType =
97777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4VIDEOEDITING_kAACplus;
97787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.uiExtendedSamplingFrequency =
97797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AacProperties.aExtensionSampFreq;
97807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
97817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
97827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( pC->AacProperties.aPSPresent )
97837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
97847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->InputFileProperties.AudioStreamType =
97857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4VIDEOEDITING_keAACplus;
97867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
97877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
97887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
97897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
97907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
97917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4OSA_TRUE == pC->bUnsupportedAudioFound )
97927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
97937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.AudioStreamType =
97947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                M4VIDEOEDITING_kUnsupportedAudio;
97957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
97967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
97977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
97987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->InputFileProperties.AudioStreamType = M4VIDEOEDITING_kNoneAudio;
97997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
98007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
98017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Get 'ftyp' atom */
98037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->m_pReader->m_pFctGetOption(pC->pReaderContext,
98047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4READER_kOptionID_3gpFtypBox, &pC->InputFileProperties.ftyp);
98057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Analysis is successful */
98077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->InputFileProperties.uiClipVideoDuration
98087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        > pC->InputFileProperties.uiClipAudioDuration )
98097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiClipDuration =
98107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiClipVideoDuration;
98117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
98127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiClipDuration =
98137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->InputFileProperties.uiClipAudioDuration;
98147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.FileType = pC->InputFileType;
98167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileProperties.bAnalysed = M4OSA_TRUE;
98177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
98197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
98207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
98227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
98237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_UInt32 M4MCS_intGetFrameSize_AMRNB(M4OSA_MemAddr8 pAudioFrame)
98247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Return the length, in bytes, of the AMR Narrow-Band frame contained in the given buffer
98257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
98267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pCpAudioFrame   (IN) AMRNB frame
98277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR: No error
98287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
98297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
98307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 M4MCS_intGetFrameSize_AMRNB( M4OSA_MemAddr8 pAudioFrame )
98317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
98327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 frameSize = 0;
98337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 frameType = ( ( *pAudioFrame) &(0xF << 3)) >> 3;
98347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( frameType )
98367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
98377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 0:
98387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 95;
98397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /*  4750 bps */
98407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 1:
98427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 103;
98437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /*  5150 bps */
98447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 2:
98467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 118;
98477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /*  5900 bps */
98487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 3:
98507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 134;
98517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /*  6700 bps */
98527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 4:
98547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 148;
98557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /*  7400 bps */
98567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 5:
98587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 159;
98597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /*  7950 bps */
98607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 6:
98627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 204;
98637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /* 10200 bps */
98647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 7:
98667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 244;
98677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /* 12000 bps */
98687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 8:
98707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 39;
98717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /* SID (Silence) */
98727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 15:
98747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 0;
98757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /* No data */
98767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
98787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE3_0(
98797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intGetFrameSize_AMRNB(): Corrupted AMR frame! returning 0.");
98807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return 0;
98817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
98827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return (1 + (( frameSize + 7) / 8));
98847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
98857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
98867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
98877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
98887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_UInt32 M4MCS_intGetFrameSize_EVRC(M4OSA_MemAddr8 pAudioFrame)
98897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Return the length, in bytes, of the EVRC frame contained in the given buffer
98907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note
98917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *     0 1 2 3
98927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *    +-+-+-+-+
98937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *    |fr type|              RFC 3558
98947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *    +-+-+-+-+
98957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
98967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Frame Type: 4 bits
98977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *    The frame type indicates the type of the corresponding codec data
98987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *    frame in the RTP packet.
98997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
99007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * For EVRC and SMV codecs, the frame type values and size of the
99017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * associated codec data frame are described in the table below:
99027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
99037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Value   Rate      Total codec data frame size (in octets)
99047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * ---------------------------------------------------------
99057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *   0     Blank      0    (0 bit)
99067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *   1     1/8        2    (16 bits)
99077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *   2     1/4        5    (40 bits; not valid for EVRC)
99087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *   3     1/2       10    (80 bits)
99097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *   4     1         22    (171 bits; 5 padded at end with zeros)
99107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *   5     Erasure    0    (SHOULD NOT be transmitted by sender)
99117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *
99127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pCpAudioFrame   (IN) EVRC frame
99137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR: No error
99147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
99157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
99167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 M4MCS_intGetFrameSize_EVRC( M4OSA_MemAddr8 pAudioFrame )
99177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
99187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 frameSize = 0;
99197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 frameType = ( *pAudioFrame) &0x0F;
99207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
99217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( frameType )
99227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
99237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 0:
99247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 0;
99257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /*  blank */
99267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
99277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 1:
99287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 16;
99297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /*  1/8 */
99307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
99317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 2:
99327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 40;
99337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /*  1/4 */
99347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
99357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 3:
99367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 80;
99377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /*  1/2 */
99387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
99397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 4:
99407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 171;
99417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /*  1 */
99427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
99437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 5:
99447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            frameSize = 0;
99457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break; /*  erasure */
99467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
99477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        default:
99487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE3_0(
99497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_intGetFrameSize_EVRC(): Corrupted EVRC frame! returning 0.");
99507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return 0;
99517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
99527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
99537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return (1 + (( frameSize + 7) / 8));
99547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
99557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
99567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
99577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
99587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intCheckMaxFileSize(M4MCS_Context pContext)
99597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Check if max file size is greater enough to encode a file with the
99607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *           current selected bitrates and duration.
99617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pContext            (IN) MCS context
99627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR
99637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4MCS_ERR_MAXFILESIZE_TOO_SMALL
99647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
99657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
99667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intCheckMaxFileSize( M4MCS_Context pContext )
99677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
99687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext *)(pContext);
99697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
99707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 duration;
99717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 audiobitrate;
99727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 videobitrate;
99737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
99747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* free file size : OK */
99757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->uiMaxFileSize == 0 )
99767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
99777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
99787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* duration */
99797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->uiEndCutTime == 0 )
99807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
99817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        duration = pC->InputFileProperties.uiClipDuration - pC->uiBeginCutTime;
99827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
99837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
99847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
99857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        duration = pC->uiEndCutTime - pC->uiBeginCutTime;
99867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
99877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
99887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* audio bitrate */
99897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->noaudio )
99907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
99917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        audiobitrate = 0;
99927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
99937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( pC->AudioEncParams.Format == M4ENCODER_kAudioNULL )
99947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
99957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        audiobitrate = pC->InputFileProperties.uiAudioBitrate;
99967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
99977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( pC->uiAudioBitrate == M4VIDEOEDITING_kUndefinedBitrate )
99987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
99997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        switch( pC->AudioEncParams.Format )
100007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
100017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            case M4ENCODER_kAMRNB:
100027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                audiobitrate = M4VIDEOEDITING_k12_2_KBPS;
100037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
100047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                //EVRC
100057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                //            case M4ENCODER_kEVRC:
100067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                //                audiobitrate = M4VIDEOEDITING_k9_2_KBPS;
100077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                //                break;
100087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
100097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            default: /* AAC and MP3*/
100107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                audiobitrate =
100117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (pC->AudioEncParams.ChannelNum == M4ENCODER_kMono)
100127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ? M4VIDEOEDITING_k16_KBPS : M4VIDEOEDITING_k32_KBPS;
100137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                break;
100147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
100157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
100167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
100177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
100187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        audiobitrate = pC->uiAudioBitrate;
100197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
100207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
100217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* video bitrate */
100227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->novideo )
100237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
100247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        videobitrate = 0;
100257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
100267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( pC->EncodingVideoFormat == M4ENCODER_kNULL )
100277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
100287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        videobitrate = pC->InputFileProperties.uiVideoBitrate;
100297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
100307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else if( pC->uiVideoBitrate == M4VIDEOEDITING_kUndefinedBitrate )
100317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
100327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        videobitrate = M4VIDEOEDITING_k16_KBPS;
100337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
100347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
100357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
100367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        videobitrate = pC->uiVideoBitrate;
100377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
100387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
100397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* max file size */
100407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( (M4OSA_UInt32)pC->uiMaxFileSize
100417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        < (M4OSA_UInt32)(M4MCS_MOOV_OVER_FILESIZE_RATIO
100427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * (audiobitrate + videobitrate) * (duration / 8000.0)) )
100437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_ERR_MAXFILESIZE_TOO_SMALL;
100447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
100457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4NO_ERROR;
100467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
100477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
100487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
100497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
100507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4VIDEOEDITING_Bitrate M4MCS_intGetNearestBitrate(M4OSA_UInt32 freebitrate, M4OSA_Int8 mode)
100517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Returns the closest bitrate value from the enum list of type M4VIDEOEDITING_Bitrate
100527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    freebitrate: unsigned int value
100537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    mode: -1:previous,0:current,1:next
100547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   bitrate value in enum list M4VIDEOEDITING_Bitrate
100557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
100567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
100577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4VIDEOEDITING_Bitrate
100587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4MCS_intGetNearestBitrate( M4OSA_Int32 freebitrate, M4OSA_Int8 mode )
100597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
100607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_Int32 bitarray [] =
100617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
100627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        0, M4VIDEOEDITING_k16_KBPS, M4VIDEOEDITING_k24_KBPS,
100637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VIDEOEDITING_k32_KBPS, M4VIDEOEDITING_k48_KBPS,
100647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VIDEOEDITING_k64_KBPS, M4VIDEOEDITING_k96_KBPS,
100657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VIDEOEDITING_k128_KBPS, M4VIDEOEDITING_k192_KBPS,
100667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VIDEOEDITING_k256_KBPS, M4VIDEOEDITING_k288_KBPS,
100677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VIDEOEDITING_k384_KBPS, M4VIDEOEDITING_k512_KBPS,
100687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VIDEOEDITING_k800_KBPS, M4VIDEOEDITING_k2_MBPS,
100697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VIDEOEDITING_k5_MBPS,
100707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4VIDEOEDITING_k8_MBPS, /*+ New Encoder bitrates */
100717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_INT32_MAX
100727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    };
100737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
100747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const M4OSA_UInt32 nbbitrates = 14;
100757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_UInt32 i;
100767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
100777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for ( i = 0; freebitrate >= bitarray[i]; i++ );
100787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
100797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    switch( mode )
100807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
100817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case -1: /* previous */
100827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( i <= 2 )
100837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return 0;
100847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
100857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return bitarray[i - 2];
100867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
100877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
100887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 0: /* current */
100897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( i <= 1 )
100907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return 0;
100917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
100927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return bitarray[i - 1];
100937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
100947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
100957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        case 1: /* next */
100967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if( i >= nbbitrates )
100977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return M4OSA_INT32_MAX;
100987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else
100997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return bitarray[i];
101007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            break;
101017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
101027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
101037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return 0;
101047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
101057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
101067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
101077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
101087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_intCleanUp_ReadersDecoders(M4MCS_InternalContext* pC);
101097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Free all resources allocated by M4MCS_open()
101107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param    pContext            (IN) MCS context
101117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return   M4NO_ERROR:         No error
101127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
101137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
101147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4MCS_intCleanUp_ReadersDecoders( M4MCS_InternalContext *pC )
101157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
101167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
101177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
101187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_1("M4MCS_intCleanUp_ReadersDecoders called with pC=0x%x", pC);
101197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
101205f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    /**/
101215f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    /* ----- Free video decoder stuff, if needed ----- */
101225f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang
101235f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    if( M4OSA_NULL != pC->pViDecCtxt )
101245f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    {
101255f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang        err = pC->m_pVideoDecoder->m_pFctDestroy(pC->pViDecCtxt);
101265f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang        pC->pViDecCtxt = M4OSA_NULL;
101275f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang
101285f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang        if( M4NO_ERROR != err )
101295f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang        {
101305f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang            M4OSA_TRACE1_1(
101315f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang                "M4MCS_cleanUp: m_pVideoDecoder->pFctDestroy returns 0x%x",
101325f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang                err);
101335f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang            /**< don't return, we still have stuff to free */
101345f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang        }
101355f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    }
101365f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang
101375f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    /* ----- Free the audio decoder stuff ----- */
101385f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang
101395f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    if( M4OSA_NULL != pC->pAudioDecCtxt )
101405f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    {
101415f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang        err = pC->m_pAudioDecoder->m_pFctDestroyAudioDec(pC->pAudioDecCtxt);
101425f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang        pC->pAudioDecCtxt = M4OSA_NULL;
101435f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang
101445f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang        if( M4NO_ERROR != err )
101455f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang        {
101465f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang            M4OSA_TRACE1_1(
101475f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang                "M4MCS_cleanUp: m_pAudioDecoder->m_pFctDestroyAudioDec returns 0x%x",
101485f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang                err);
101495f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang            /**< don't return, we still have stuff to free */
101505f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang        }
101515f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    }
101525f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang
101535f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    if( M4OSA_NULL != pC->AudioDecBufferOut.m_dataAddress )
101545f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    {
101555f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang        free(pC->AudioDecBufferOut.m_dataAddress);
101565f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang        pC->AudioDecBufferOut.m_dataAddress = M4OSA_NULL;
101575f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    }
101585f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang
101597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* ----- Free reader stuff, if needed ----- */
101605f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    // We cannot free the reader before decoders because the decoders may read
101615f9cd08076587935f798b2b2eba4aa202362f532Chih-Chung Chang    // from the reader (in another thread) before being stopped.
101627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
101637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( M4OSA_NULL != pC->
101647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pReaderContext ) /**< may be M4OSA_NULL if M4MCS_open was not called */
101657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
101667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReader->m_pFctClose(pC->pReaderContext);
101677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
101687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
101697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
101707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1("M4MCS_cleanUp: m_pReader->m_pFctClose returns 0x%x",
101717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                err);
101727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< don't return, we still have stuff to free */
101737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
101747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
101757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReader->m_pFctDestroy(pC->pReaderContext);
101767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->pReaderContext = M4OSA_NULL;
101777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
101787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if( M4NO_ERROR != err )
101797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
101807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4OSA_TRACE1_1(
101817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                "M4MCS_cleanUp: m_pReader->m_pFctDestroy returns 0x%x", err);
101827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**< don't return, we still have stuff to free */
101837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
101847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
101857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
101867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_pDataAddress1 != M4OSA_NULL )
101877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
10188694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->m_pDataAddress1);
101897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->m_pDataAddress1 = M4OSA_NULL;
101907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
101917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
101927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_pDataAddress2 != M4OSA_NULL )
101937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
10194694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->m_pDataAddress2);
101957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->m_pDataAddress2 = M4OSA_NULL;
101967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
101977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*Bug fix 11/12/2008 (to obtain more precise video end cut)*/
101987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_pDataVideoAddress1 != M4OSA_NULL )
101997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
10200694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->m_pDataVideoAddress1);
102017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->m_pDataVideoAddress1 = M4OSA_NULL;
102027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
102037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( pC->m_pDataVideoAddress2 != M4OSA_NULL )
102057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
10206694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free(pC->m_pDataVideoAddress2);
102077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->m_pDataVideoAddress2 = M4OSA_NULL;
102087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
102097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
102117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
102127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
102157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
102177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4MCS_open_normalMode(M4MCS_Context pContext, M4OSA_Void* pFileIn,
102187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                             M4OSA_Void* pFileOut, M4OSA_Void* pTempFile);
102197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Set the MCS input and output files. It is the same as M4MCS_open without
102207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                M4MCS_WITH_FAST_OPEN flag
102217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiIt is used in VideoArtist
102227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    It opens the input file, but the output file is not created yet.
102237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext            (IN) MCS context
102247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pFileIn             (IN) Input file to transcode (The type of this parameter
102257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                    (URL, pipe...) depends on the OSAL implementation).
102267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   mediaType           (IN) Container type (.3gp,.amr, ...) of input file.
102277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pFileOut            (IN) Output file to create  (The type of this parameter
102287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                (URL, pipe...) depends on the OSAL implementation).
102297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pTempFile           (IN) Temporary file for the constant memory writer to store
102307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                 metadata ("moov.bin").
102317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4NO_ERROR:         No error
102327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
102337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_STATE:        MCS is not in an appropriate state for this function to be called
102347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_ALLOC:        There is no more available memory
102357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4ERR_FILE_NOT_FOUND:   The input file has not been found
102367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_INVALID_INPUT_FILE:   The input file is not a valid file, or is corrupted
102377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4MCS_ERR_INPUT_FILE_CONTAINS_NO_SUPPORTED_STREAM:  The input file contains no
102387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                                         supported audio or video stream
102397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
102407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
102417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MCS_open_normalMode(M4MCS_Context pContext, M4OSA_Void* pFileIn,
102427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 M4VIDEOEDITING_FileType InputFileType,
102437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                  M4OSA_Void* pFileOut, M4OSA_Void* pTempFile)
102447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
102457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4MCS_InternalContext *pC = (M4MCS_InternalContext*)(pContext);
102467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_ERR err;
102477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4READER_MediaFamily mediaFamily;
102497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4_StreamHandler* pStreamHandler;
102507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE2_3("M4MCS_open_normalMode called with pContext=0x%x, pFileIn=0x%x,\
102527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     pFileOut=0x%x", pContext, pFileIn, pFileOut);
102537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
102557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check input parameters */
102567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER,
102577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     "M4MCS_open_normalMode: pContext is M4OSA_NULL");
102587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_DEBUG_IF2((M4OSA_NULL == pFileIn) , M4ERR_PARAMETER,
102597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi     "M4MCS_open_normalMode: pFileIn is M4OSA_NULL");
102607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ((InputFileType == M4VIDEOEDITING_kFileType_JPG)
102627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ||(InputFileType == M4VIDEOEDITING_kFileType_PNG)
102637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ||(InputFileType == M4VIDEOEDITING_kFileType_GIF)
102647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        ||(InputFileType == M4VIDEOEDITING_kFileType_BMP))
102657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
102667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0("M4MCS_open_normalMode: Still picture is not\
102677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             supported with this function");
102687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_ERR_INPUT_FILE_CONTAINS_NO_SUPPORTED_STREAM;
102697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
102707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
102727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check state automaton */
102737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4MCS_kState_CREATED != pC->State)
102747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
102757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1("M4MCS_open_normalMode(): Wrong State (%d), returning M4ERR_STATE",
102767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             pC->State);
102777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4ERR_STATE;
102787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
102797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Copy function input parameters into our context */
102817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pInputFile     = pFileIn;
102827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->InputFileType  = InputFileType;
102837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pOutputFile    = pFileOut;
102847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pTemporaryFile = pTempFile;
102857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /***********************************/
102877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Open input file with the reader */
102887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /***********************************/
102897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_setCurrentReader(pContext, pC->InputFileType);
102917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4ERR_CHECK_RETURN(err);
102927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
102937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
102947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Reset reader related variables */
102957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->VideoState          = M4MCS_kStreamState_NOSTREAM;
102967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->AudioState          = M4MCS_kStreamState_NOSTREAM;
102977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pReaderVideoStream  = M4OSA_NULL;
102987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->pReaderAudioStream  = M4OSA_NULL;
102997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
103007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*******************************************************/
103017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Initializes the reader shell and open the data file */
103027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*******************************************************/
103037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->m_pReader->m_pFctCreate(&pC->pReaderContext);
103047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4NO_ERROR != err)
103057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
103067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1("M4MCS_open_normalMode(): m_pReader->m_pFctCreate returns 0x%x", err);
103077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
103087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
103097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
103107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
103117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Link the reader interface to the reader context */
103127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->m_pReaderDataIt->m_readerContext = pC->pReaderContext;
103137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
103147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
103157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Set the reader shell file access functions */
103167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->m_pReader->m_pFctSetOption(pC->pReaderContext,
103177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         M4READER_kOptionID_SetOsaFileReaderFctsPtr,
103187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (M4OSA_DataOption)pC->pOsaFileReadPtr);
103197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4NO_ERROR != err)
103207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
103217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1("M4MCS_open_normalMode(): m_pReader->m_pFctSetOption returns 0x%x", err);
103227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
103237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
103247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
103257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
103267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Open the input file */
103277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = pC->m_pReader->m_pFctOpen(pC->pReaderContext, pC->pInputFile);
103287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4NO_ERROR != err)
103297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
103307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_UInt32 uiDummy, uiCoreId;
103317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1("M4MCS_open_normalMode(): m_pReader->m_pFctOpen returns 0x%x", err);
103327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
103331dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava        if (err == ((M4OSA_UInt32)M4ERR_UNSUPPORTED_MEDIA_TYPE)) {
103341dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava            M4OSA_TRACE1_0("M4MCS_open_normalMode(): returning M4MCS_ERR_FILE_DRM_PROTECTED");
103351dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava            return M4MCS_ERR_FILE_DRM_PROTECTED;
103361dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava        } else {
103371dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava            /**
103381dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava            * If the error is from the core reader, we change it to a public VXS error */
103391dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava            M4OSA_ERR_SPLIT(err, uiDummy, uiCoreId, uiDummy);
103401dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava            if (M4MP4_READER == uiCoreId)
103411dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava            {
103421dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava                M4OSA_TRACE1_0("M4MCS_open_normalMode(): returning M4MCS_ERR_INVALID_INPUT_FILE");
103431dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava                return M4MCS_ERR_INVALID_INPUT_FILE;
103441dd524b567ef1bb0591eb8adce10d43841376f5dSantosh Madhava            }
103457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
103467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
103477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
103487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
103497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
103507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Get the streams from the input file */
103517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while (M4NO_ERROR == err)
103527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
103537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = pC->m_pReader->m_pFctGetNextStream(pC->pReaderContext, &mediaFamily,
103547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            &pStreamHandler);
103557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
103567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /**
103577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        * In case we found a BIFS stream or something else...*/
103587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if((err == ((M4OSA_UInt32)M4ERR_READER_UNKNOWN_STREAM_TYPE))
103597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            || (err == ((M4OSA_UInt32)M4WAR_TOO_MUCH_STREAMS)))
103607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
103617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4NO_ERROR;
103627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            continue;
103637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
103647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
103657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (M4NO_ERROR == err) /**< One stream found */
103667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
103677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
103687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Found the first video stream */
103697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if ((M4READER_kMediaFamilyVideo == mediaFamily) \
103707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                && (M4OSA_NULL == pC->pReaderVideoStream))
103717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
103727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if ((M4DA_StreamTypeVideoH263==pStreamHandler->m_streamType) ||
103737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4DA_StreamTypeVideoMpeg4==pStreamHandler->m_streamType)
103747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_SUPPORT_VIDEO_AVC
103757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ||(M4DA_StreamTypeVideoMpeg4Avc==pStreamHandler->m_streamType))
103767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else
103777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    ||((M4DA_StreamTypeVideoMpeg4Avc==pStreamHandler->m_streamType)
103787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    &&(pC->m_pVideoDecoderItTable[M4DECODER_kVideoTypeAVC] != M4OSA_NULL)))
103797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
103807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
103817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE3_0("M4MCS_open_normalMode():\
103827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                     Found a H263 or MPEG-4 video stream in input 3gpp clip");
103837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
103847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
103857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Keep pointer to the video stream */
103867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pReaderVideoStream = (M4_VideoStreamHandler*)pStreamHandler;
103877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->bUnsupportedVideoFound = M4OSA_FALSE;
103887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pStreamHandler->m_bStreamIsOK = M4OSA_TRUE;
103897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
103907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
103917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Init our video stream state variable */
103927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->VideoState = M4MCS_kStreamState_STARTED;
103937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
103947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
103957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Reset the stream reader */
103967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = pC->m_pReader->m_pFctReset(pC->pReaderContext,
103977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                         (M4_StreamHandler*)pC->pReaderVideoStream);
103987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if (M4NO_ERROR != err)
103997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
104007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1("M4MCS_open_normalMode():\
104017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             m_pReader->m_pFctReset(video) returns 0x%x", err);
104027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
104037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
104047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
104057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
104067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Initializes an access Unit */
104077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = pC->m_pReader->m_pFctFillAuStruct(pC->pReaderContext, pStreamHandler,
104087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                         &pC->ReaderVideoAU);
104097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if (M4NO_ERROR != err)
104107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
104117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1("M4MCS_open_normalMode():\
104127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             m_pReader->m_pFctFillAuStruct(video) returns 0x%x", err);
104137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
104147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
104157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
104167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else /**< Not H263 or MPEG-4 (H264, etc.) */
104177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
104187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1("M4MCS_open_normalMode():\
104197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                         Found an unsupported video stream (0x%x) in input 3gpp clip",
104207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             pStreamHandler->m_streamType);
104217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
104227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->bUnsupportedVideoFound = M4OSA_TRUE;
104237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pStreamHandler->m_bStreamIsOK = M4OSA_FALSE;
104247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
104257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
104267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /**
104277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            * Found the first audio stream */
104287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            else if ((M4READER_kMediaFamilyAudio == mediaFamily)
104297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                && (M4OSA_NULL == pC->pReaderAudioStream))
104307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
104317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                if ((M4DA_StreamTypeAudioAmrNarrowBand==pStreamHandler->m_streamType) ||
104327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4DA_StreamTypeAudioAac==pStreamHandler->m_streamType) ||
104337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4DA_StreamTypeAudioMp3==pStreamHandler->m_streamType) ||
104347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    (M4DA_StreamTypeAudioEvrc==pStreamHandler->m_streamType) )
104357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
104367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE3_0("M4MCS_open_normalMode(): Found an AMR-NB, AAC \
104377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        or MP3 audio stream in input clip");
104387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
104397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
104407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Keep pointer to the audio stream */
104417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->pReaderAudioStream = (M4_AudioStreamHandler*)pStreamHandler;
104427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pStreamHandler->m_bStreamIsOK = M4OSA_TRUE;
104437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->bUnsupportedAudioFound = M4OSA_FALSE;
104447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
104457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
104467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Init our audio stream state variable */
104477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->AudioState = M4MCS_kStreamState_STARTED;
104487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
104497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
104507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Reset the stream reader */
104517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = pC->m_pReader->m_pFctReset(pC->pReaderContext,
104527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                         (M4_StreamHandler*)pC->pReaderAudioStream);
104537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if (M4NO_ERROR != err)
104547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
104557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1("M4MCS_open_normalMode():\
104567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                             m_pReader->m_pFctReset(audio) returns 0x%x", err);
104577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
104587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
104597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
104607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
104617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Initializes an access Unit */
104627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    err = pC->m_pReader->m_pFctFillAuStruct(pC->pReaderContext, pStreamHandler,
104637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                         &pC->ReaderAudioAU);
104647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    if (M4NO_ERROR != err)
104657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    {
104667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        M4OSA_TRACE1_1("M4MCS_open_normalMode(): \
104677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                            m_pReader->m_pFctFillAuStruct(audio) returns 0x%x", err);
104687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                        return err;
104697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    }
104707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
104717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**
104727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * Output max AU size is equal to input max AU size (this value
104737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    * will be changed if there is audio transcoding) */
104747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->uiAudioMaxAuSize = pStreamHandler->m_maxAUSize;
104757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
104767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
104777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                else
104787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                {
104797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    /**< Not AMR-NB, AAC, MP3 nor EVRC (AMR-WB, WAV...) */
104807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    M4OSA_TRACE1_1("M4MCS_open_normalMode(): Found an unsupported audio stream\
104817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                         (0x%x) in input 3gpp clip", pStreamHandler->m_streamType);
104827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
104837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pC->bUnsupportedAudioFound = M4OSA_TRUE;
104847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    pStreamHandler->m_bStreamIsOK = M4OSA_FALSE;
104857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                }
104867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
104877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
104887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } /**< end of while (M4NO_ERROR == err) */
104897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
104907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
104917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Check we found at least one supported stream */
104927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if((M4OSA_NULL == pC->pReaderVideoStream) && (M4OSA_NULL == pC->pReaderAudioStream))
104937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
104947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_0("M4MCS_open_normalMode(): returning \
104957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4MCS_ERR_INPUT_FILE_CONTAINS_NO_SUPPORTED_STREAM");
104967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4MCS_ERR_INPUT_FILE_CONTAINS_NO_SUPPORTED_STREAM;
104977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
104987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
104997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef M4VSS_ENABLE_EXTERNAL_DECODERS
105007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(pC->VideoState == M4MCS_kStreamState_STARTED)
105017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
105027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        err = M4MCS_setCurrentVideoDecoder(pContext,
105037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->pReaderVideoStream->m_basicProperties.m_streamType);
105047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4ERR_CHECK_RETURN(err);
105057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
105067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif
105077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
105087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if(pC->AudioState == M4MCS_kStreamState_STARTED)
105097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
105107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        //EVRC
105117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if(M4DA_StreamTypeAudioEvrc != pStreamHandler->m_streamType)
105127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         /* decoder not supported yet, but allow to do null encoding */
105137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
105147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            err = M4MCS_setCurrentAudioDecoder(pContext,
105157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                 pC->pReaderAudioStream->m_basicProperties.m_streamType);
105167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            M4ERR_CHECK_RETURN(err);
105177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
105187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
105197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
105207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
105217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Get the audio and video stream properties */
105227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    err = M4MCS_intGetInputClipProperties(pC);
105237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (M4NO_ERROR != err)
105247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
105257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        M4OSA_TRACE1_1("M4MCS_open_normalMode():\
105267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi             M4MCS_intGetInputClipProperties returns 0x%x", err);
105277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return err;
105287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
105297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
105307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
105317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Set the begin cut decoding increment according to the input frame rate */
105327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (0. != pC->InputFileProperties.fAverageFrameRate) /**< sanity check */
105337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
105347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->iVideoBeginDecIncr = (M4OSA_Int32)(3000. \
105357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            / pC->InputFileProperties.fAverageFrameRate); /**< about 3 frames */
105367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
105377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
105387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
105397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->iVideoBeginDecIncr = 200; /**< default value: 200 milliseconds (3 frames @ 15fps)*/
105407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
105417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
105427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
105437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Update state automaton */
105447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pC->State = M4MCS_kState_OPENED;
105457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
105467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /**
105477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    * Return with no error */
105487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4OSA_TRACE3_0("M4MCS_open_normalMode(): returning M4NO_ERROR");
105497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4NO_ERROR;
105507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
105517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
105528a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh ChowduryM4OSA_ERR M4MCS_intCheckAndGetCodecProperties(
10553bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury                                 M4MCS_InternalContext *pC) {
10554bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10555bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    M4OSA_ERR err = M4NO_ERROR;
10556bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    M4AD_Buffer outputBuffer;
10557bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    uint32_t optionValue =0;
10558bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
105598a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury    M4OSA_TRACE3_0("M4MCS_intCheckAndGetCodecProperties :start");
10560bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10561bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    // Decode first audio frame from clip to get properties from codec
10562bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
105638a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury    if (M4DA_StreamTypeAudioAac ==
105648a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury            pC->pReaderAudioStream->m_basicProperties.m_streamType) {
105658a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury
105668a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury        err = pC->m_pAudioDecoder->m_pFctCreateAudioDec(
10567bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury                    &pC->pAudioDecCtxt,
10568bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury                    pC->pReaderAudioStream, &(pC->AacProperties));
105698a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury    } else {
105708a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury        err = pC->m_pAudioDecoder->m_pFctCreateAudioDec(
105718a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    &pC->pAudioDecCtxt,
105728a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    pC->pReaderAudioStream,
105738a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                    pC->m_pCurrentAudioDecoderUserData);
105748a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury    }
10575799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury    if (M4NO_ERROR != err) {
10576799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury
10577799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury        M4OSA_TRACE1_1(
10578799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury            "M4MCS_intCheckAndGetCodecProperties: m_pFctCreateAudioDec \
10579799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury             returns 0x%x", err);
10580799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury        return err;
10581799de64f085ccf2a58f0c74a151badaabd0bd679Rajneesh Chowdury    }
10582bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10583bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    pC->m_pAudioDecoder->m_pFctSetOptionAudioDec(pC->pAudioDecCtxt,
10584bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury           M4AD_kOptionID_3gpReaderInterface, (M4OSA_DataOption) pC->m_pReaderDataIt);
10585bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10586bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    pC->m_pAudioDecoder->m_pFctSetOptionAudioDec(pC->pAudioDecCtxt,
10587bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury           M4AD_kOptionID_AudioAU, (M4OSA_DataOption) &pC->ReaderAudioAU);
10588bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10589bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    if( pC->m_pAudioDecoder->m_pFctStartAudioDec != M4OSA_NULL ) {
10590bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10591bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        err = pC->m_pAudioDecoder->m_pFctStartAudioDec(pC->pAudioDecCtxt);
10592bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        if( M4NO_ERROR != err ) {
10593bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10594bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            M4OSA_TRACE1_1(
105958a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                "M4MCS_intCheckAndGetCodecProperties: m_pFctStartAudioDec \
10596bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury                 returns 0x%x", err);
10597bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            return err;
10598bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        }
10599bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    }
10600bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10601bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    /**
10602bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    * Allocate output buffer for the audio decoder */
10603bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    outputBuffer.m_bufferSize =
10604bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        pC->pReaderAudioStream->m_byteFrameLength
10605bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        * pC->pReaderAudioStream->m_byteSampleSize
10606bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        * pC->pReaderAudioStream->m_nbChannels;
10607bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10608bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    if( outputBuffer.m_bufferSize > 0 ) {
10609bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10610bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        outputBuffer.m_dataAddress =
10611bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(outputBuffer.m_bufferSize \
10612bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            *sizeof(short), M4MCS, (M4OSA_Char *)"outputBuffer.m_bufferSize");
10613bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10614bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        if( M4OSA_NULL == outputBuffer.m_dataAddress ) {
10615bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10616bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            M4OSA_TRACE1_0(
106178a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                "M4MCS_intCheckAndGetCodecProperties():\
10618bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury                 unable to allocate outputBuffer.m_dataAddress, returning M4ERR_ALLOC");
10619bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            return M4ERR_ALLOC;
10620bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        }
10621bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    }
10622bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10623bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    err = pC->m_pAudioDecoder->m_pFctStepAudioDec(pC->pAudioDecCtxt,
10624bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        M4OSA_NULL, &outputBuffer, M4OSA_FALSE);
10625bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10626bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    if ( err == M4WAR_INFO_FORMAT_CHANGE ) {
10627bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10628bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        // Get the properties from codec node
10629bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        pC->m_pAudioDecoder->m_pFctGetOptionAudioDec(pC->pAudioDecCtxt,
10630bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury           M4AD_kOptionID_AudioNbChannels, (M4OSA_DataOption) &optionValue);
10631bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10632bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        // Reset Reader structure value also
10633bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        pC->pReaderAudioStream->m_nbChannels = optionValue;
10634bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10635bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        pC->m_pAudioDecoder->m_pFctGetOptionAudioDec(pC->pAudioDecCtxt,
10636bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury         M4AD_kOptionID_AudioSampFrequency, (M4OSA_DataOption) &optionValue);
10637bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10638bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        // Reset Reader structure value also
10639bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury        pC->pReaderAudioStream->m_samplingFrequency = optionValue;
10640bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
106418a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury        if (M4DA_StreamTypeAudioAac ==
106428a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury            pC->pReaderAudioStream->m_basicProperties.m_streamType) {
106438a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury
106448a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury            pC->AacProperties.aNumChan =
106458a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                pC->pReaderAudioStream->m_nbChannels;
106468a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury            pC->AacProperties.aSampFreq =
106478a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury                pC->pReaderAudioStream->m_samplingFrequency;
106488a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury
106498a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury        }
106508a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury
10651bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    } else if( err != M4NO_ERROR) {
106528a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury        M4OSA_TRACE1_1("M4MCS_intCheckAndGetCodecProperties:\
10653bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            m_pFctStepAudioDec returns err = 0x%x", err);
10654bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    }
10655bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10656bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    free(outputBuffer.m_dataAddress);
10657bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10658bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    // Reset the stream reader
10659bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    err = pC->m_pReader->m_pFctReset(pC->pReaderContext,
10660bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury                 (M4_StreamHandler *)pC->pReaderAudioStream);
10661bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10662bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    if (M4NO_ERROR != err) {
106638a1f7cc319b9c3c8d40fefb4439c746e5b250820Rajneesh Chowdury        M4OSA_TRACE1_1("M4MCS_intCheckAndGetCodecProperties\
10664bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury            Error in reseting reader: 0x%x", err);
10665bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    }
10666bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10667bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury    return err;
10668bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury
10669bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury}
1067095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1067195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh ChowduryM4OSA_ERR M4MCS_intLimitBitratePerCodecProfileLevel(
1067295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                 M4ENCODER_AdvancedParams* EncParams) {
1067395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1067495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    M4OSA_ERR err = M4NO_ERROR;
1067595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1067695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    switch (EncParams->Format) {
1067795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        case M4ENCODER_kH263:
1067895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            EncParams->Bitrate = M4MCS_intLimitBitrateForH263Enc(
1067995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                     EncParams->videoProfile,
1068095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                     EncParams->videoLevel, EncParams->Bitrate);
1068195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            break;
1068295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1068395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        case M4ENCODER_kMPEG4:
1068495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            EncParams->Bitrate = M4MCS_intLimitBitrateForMpeg4Enc(
1068595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                     EncParams->videoProfile,
1068695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                     EncParams->videoLevel, EncParams->Bitrate);
1068795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            break;
1068895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1068995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        case M4ENCODER_kH264:
1069095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            EncParams->Bitrate = M4MCS_intLimitBitrateForH264Enc(
1069195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                     EncParams->videoProfile,
1069295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                     EncParams->videoLevel, EncParams->Bitrate);
1069395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            break;
1069495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1069595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        default:
1069695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            M4OSA_TRACE1_1("M4MCS_intLimitBitratePerCodecProfileLevel: \
1069795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                Wrong enc format %d", EncParams->Format);
1069895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            err = M4ERR_PARAMETER;
1069995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            break;
1070095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    }
1070195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1070295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    return err;
1070395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1070495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury}
1070595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1070695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh ChowduryM4OSA_Int32 M4MCS_intLimitBitrateForH264Enc(M4OSA_Int32 profile,
1070795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                    M4OSA_Int32 level, M4OSA_Int32 bitrate) {
1070895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1070995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    M4OSA_Int32 vidBitrate = 0;
1071095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1071195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    switch (profile) {
1071295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        case OMX_VIDEO_AVCProfileBaseline:
1071395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        case OMX_VIDEO_AVCProfileMain:
1071495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1071595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            switch (level) {
1071695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1071795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel1:
1071895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 64000) ? 64000 : bitrate;
1071995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1072095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1072195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel1b:
1072295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 128000) ? 128000 : bitrate;
1072395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1072495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1072595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel11:
1072695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 192000) ? 192000 : bitrate;
1072795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1072895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1072995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel12:
1073095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 384000) ? 384000 : bitrate;
1073195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1073295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1073395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel13:
1073495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 768000) ? 768000 : bitrate;
1073595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1073695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1073795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel2:
1073895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 2000000) ? 2000000 : bitrate;
1073995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1074095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1074195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel21:
1074295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 4000000) ? 4000000 : bitrate;
1074395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1074495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1074595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel22:
1074695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 4000000) ? 4000000 : bitrate;
1074795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1074895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1074995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel3:
1075095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 10000000) ? 10000000 : bitrate;
1075195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1075295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1075395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel31:
1075495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 14000000) ? 14000000 : bitrate;
1075595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1075695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1075795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel32:
1075895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 20000000) ? 20000000 : bitrate;
1075995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1076095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1076195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel4:
1076295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 20000000) ? 20000000 : bitrate;
1076395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1076495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1076595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel41:
1076695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 50000000) ? 50000000 : bitrate;
1076795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1076895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1076995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel42:
1077095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 50000000) ? 50000000 : bitrate;
1077195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1077295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1077395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel5:
1077495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 135000000) ? 135000000 : bitrate;
1077595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1077695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1077795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel51:
1077895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 240000000) ? 240000000 : bitrate;
1077995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1078095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1078195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                default:
1078295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = bitrate;
1078395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1078495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            }
1078595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            break;
1078695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1078795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        case OMX_VIDEO_AVCProfileHigh:
1078895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            switch (level) {
1078995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel1:
1079095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 80000) ? 80000 : bitrate;
1079195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1079295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1079395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel1b:
1079495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 160000) ? 160000 : bitrate;
1079595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1079695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1079795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel11:
1079895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 240000) ? 240000 : bitrate;
1079995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1080095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1080195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel12:
1080295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 480000) ? 480000 : bitrate;
1080395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1080495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1080595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel13:
1080695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 960000) ? 960000 : bitrate;
1080795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1080895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1080995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel2:
1081095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 2500000) ? 2500000 : bitrate;
1081195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1081295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1081395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel21:
1081495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 5000000) ? 5000000 : bitrate;
1081595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1081695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1081795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel22:
1081895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 5000000) ? 5000000 : bitrate;
1081995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1082095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1082195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel3:
1082295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 12500000) ? 12500000 : bitrate;
1082395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1082495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1082595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel31:
1082695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 17500000) ? 17500000 : bitrate;
1082795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1082895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1082995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel32:
1083095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 25000000) ? 25000000 : bitrate;
1083195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1083295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1083395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel4:
1083495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 25000000) ? 25000000 : bitrate;
1083595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1083695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1083795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel41:
1083895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 62500000) ? 62500000 : bitrate;
1083995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1084095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1084195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel42:
1084295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 62500000) ? 62500000 : bitrate;
1084395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1084495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1084595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel5:
1084695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 168750000) ? 168750000 : bitrate;
1084795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1084895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1084995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_AVCLevel51:
1085095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 300000000) ? 300000000 : bitrate;
1085195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1085295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1085395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                default:
1085495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = bitrate;
1085595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1085695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            }
1085795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            break;
1085895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1085995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        default:
1086095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            // We do not handle any other AVC profile for now.
1086195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            // Return input bitrate
1086295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            vidBitrate = bitrate;
1086395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            break;
1086495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    }
1086595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1086695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    return vidBitrate;
1086795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury}
1086895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1086995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh ChowduryM4OSA_Int32 M4MCS_intLimitBitrateForMpeg4Enc(M4OSA_Int32 profile,
1087095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                    M4OSA_Int32 level, M4OSA_Int32 bitrate) {
1087195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1087295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    M4OSA_Int32 vidBitrate = 0;
1087395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1087495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    switch (profile) {
1087595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        case OMX_VIDEO_MPEG4ProfileSimple:
1087695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            switch (level) {
1087795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1087895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_MPEG4Level0:
1087995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 64000) ? 64000 : bitrate;
1088095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1088195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1088295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_MPEG4Level0b:
1088395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 128000) ? 128000 : bitrate;
1088495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1088595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1088695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_MPEG4Level1:
1088795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 64000) ? 64000 : bitrate;
1088895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1088995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1089095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_MPEG4Level2:
1089195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 128000) ? 128000 : bitrate;
1089295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1089395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1089495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_MPEG4Level3:
1089595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 384000) ? 384000 : bitrate;
1089695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1089795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1089895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                default:
1089995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = bitrate;
1090095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1090195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            }
1090295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            break;
1090395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1090495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        default:
1090595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            // We do not handle any other MPEG4 profile for now.
1090695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            // Return input bitrate
1090795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            vidBitrate = bitrate;
1090895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            break;
1090995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    }
1091095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1091195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    return vidBitrate;
1091295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury}
1091395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1091495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh ChowduryM4OSA_Int32 M4MCS_intLimitBitrateForH263Enc(M4OSA_Int32 profile,
1091595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                                    M4OSA_Int32 level, M4OSA_Int32 bitrate) {
1091695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1091795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    M4OSA_Int32 vidBitrate = 0;
1091895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1091995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    switch (profile) {
1092095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        case OMX_VIDEO_H263ProfileBaseline:
1092195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            switch (level) {
1092295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1092395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_H263Level10:
1092495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 64000) ? 64000 : bitrate;
1092595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1092695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1092795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_H263Level20:
1092895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 128000) ? 128000 : bitrate;
1092995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1093095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1093195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                case OMX_VIDEO_H263Level30:
1093295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = (bitrate > 384000) ? 384000 : bitrate;
1093395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1093495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1093595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                default:
1093695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    vidBitrate = bitrate;
1093795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury                    break;
1093895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            }
1093995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            break;
1094095651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1094195651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury        default:
1094295651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            // We do not handle any other H263 profile for now.
1094395651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            // Return input bitrate
1094495651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            vidBitrate = bitrate;
1094595651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury            break;
1094695651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    }
1094795651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury
1094895651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury    return vidBitrate;
1094995651ebc7fbb2efba3f407f4825b7805874bbdf2Rajneesh Chowdury}
10950