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