17c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* 27c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project 37c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 47c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License"); 57c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * you may not use this file except in compliance with the License. 67c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * You may obtain a copy of the License at 77c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 87c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * http://www.apache.org/licenses/LICENSE-2.0 97c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software 117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS, 127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * See the License for the specific language governing permissions and 147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * limitations under the License. 157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @file M4VSS3GPP_Clip.c 197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Implementation of functions related to input clip management. 207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note All functions in this file are static, i.e. non public 217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/****************/ 257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*** Includes ***/ 267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/****************/ 277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "NXPSW_CompilerSwitches.h" 297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Our headers */ 317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_API.h" 327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_ErrorCodes.h" 337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_InternalTypes.h" 347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_InternalFunctions.h" 357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VSS3GPP_InternalConfig.h" 367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * OSAL headers */ 397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Memory.h" /* OSAL memory management */ 407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h" /* OSAL debug management */ 417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Common headers (for aac) */ 457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4_Common.h" 467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS 487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VD_EXTERNAL_Interface.h" 497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */ 517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Osal header fileno */ 537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_CharStar.h" 547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * define Static function prototypes 587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intClipPrepareAudioDecoder( 627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_ClipContext *pClipCtxt ); 637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 64bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdurystatic M4OSA_ERR M4VSS3GPP_intCheckAndGetCodecAacProperties( 65bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4VSS3GPP_ClipContext *pClipCtxt); 66bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intClipOpen() 707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Open a clip. Creates a clip context. 717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param hClipCtxt (OUT) Return the internal clip context 737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pClipSettings (IN) Edit settings of this clip. The module will keep a 747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * reference to this pointer 757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pFileReadPtrFct (IN) Pointer to OSAL file reader functions 767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param bSkipAudioTrack (IN) If true, do not open the audio 777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param bFastOpenMode (IN) If true, use the fast mode of the 3gpp reader 787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (only the first AU is read) 797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: No error 807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_ALLOC: There is no more available memory 817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intClipInit( M4VSS3GPP_ClipContext ** hClipCtxt, 857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FileReadPointer *pFileReadPtrFct ) 867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_ClipContext *pClipCtxt; 887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == hClipCtxt), M4ERR_PARAMETER, 917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipInit: hClipCtxt is M4OSA_NULL"); 927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == pFileReadPtrFct), M4ERR_PARAMETER, 937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipInit: pFileReadPtrFct is M4OSA_NULL"); 947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Allocate the clip context */ 977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *hClipCtxt = 98694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4VSS3GPP_ClipContext *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_ClipContext), 997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP, (M4OSA_Char *)"M4VSS3GPP_ClipContext"); 1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL == *hClipCtxt ) 1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipInit(): unable to allocate M4VSS3GPP_ClipContext,\ 1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4ERR_ALLOC"); 1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1("M4VSS3GPP_intClipInit(): clipCtxt=0x%x", *hClipCtxt); 1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Use this shortcut to simplify the code */ 1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt = *hClipCtxt; 1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Inialization of context Variables */ 11632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memset((void *)pClipCtxt, 0,sizeof(M4VSS3GPP_ClipContext)); 1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pSettings = M4OSA_NULL; 1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Init the clip context */ 1226e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->iVoffset = 0; 1236e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->iAoffset = 0; 1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->Vstatus = M4VSS3GPP_kClipStatus_READ; 1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->Astatus = M4VSS3GPP_kClipStatus_READ; 1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext = M4OSA_NULL; 1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pVideoStream = M4OSA_NULL; 1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioStream = M4OSA_NULL; 1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->VideoAU.m_dataAddress = M4OSA_NULL; 1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioAU.m_dataAddress = M4OSA_NULL; 1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pViDecCtxt = M4OSA_NULL; 1346e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->iVideoDecCts = 0; 1356e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->iVideoRenderCts = 0; 1366e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->lastDecodedPlane = M4OSA_NULL; 1376e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->iActualVideoBeginCut = 0; 1386e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->iActualAudioBeginCut = 0; 1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->bVideoAuAvailable = M4OSA_FALSE; 1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->bFirstAuWritten = M4OSA_FALSE; 1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->bMpeg4GovState = M4OSA_FALSE; 1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->bAudioFrameAvailable = M4OSA_FALSE; 1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioFramePtr = M4OSA_NULL; 1466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->iAudioFrameCts = 0; 1476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pAudioDecCtxt = 0; 1486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->AudioDecBufferOut.m_bufferSize = 0; 1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioDecBufferOut.m_dataAddress = M4OSA_NULL; 1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pFileReadPtrFct = pFileReadPtrFct; 1526e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv = M4OSA_NULL; 1536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect = M4OSA_NULL; 1546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->m_pPreResizeFrame = M4OSA_NULL; 1556e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->bGetYuvDataFromDecoder = M4OSA_TRUE; 1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Reset pointers for media and codecs interfaces */ 1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_clearInterfaceTables(&pClipCtxt->ShellAPI); 1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CHECK_RETURN(err); 1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Call the media and codecs subscription module */ 1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_subscribeMediaAndCodec(&pClipCtxt->ShellAPI); 1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CHECK_RETURN(err); 1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 170cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong// This method maps the frequency value to a string. 171cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dongstatic const char* freqToString(int freq) { 172cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong switch (freq) { 173cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong case 8000: 174cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return "_8000"; 175cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong case 11025: 176cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return "_11025"; 177cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong case 12000: 178cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return "_12000"; 179cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong case 16000: 180cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return "_16000"; 181cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong case 22050: 182cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return "_22050"; 183cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong case 24000: 184cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return "_24000"; 185cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong case 32000: 186cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return "_32000"; 187cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong case 44100: 188cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return "_44100"; 189cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong case 48000: 190cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return "_48000"; 191cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong default: 192cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong M4OSA_TRACE1_1("Unsupported sampling rate: %d Hz", freq); 193cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return NULL; 194cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong } 195cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong} 196cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong 197cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong// This method maps the number of channel value to 198cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong// a string that will be part of a file name extension 199cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dongstatic const char* channelToStringAndFileExt(int channels) { 200cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong switch (channels) { 201cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong case 1: 202cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return "_1.pcm"; 203cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong case 2: 204cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return "_2.pcm"; 205cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong default: 206cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong M4OSA_TRACE1_1("Unsupported %d channels", channels); 207cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return NULL; 208cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong } 209cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong} 210cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong 2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Note: if the clip is opened in fast mode, it can only be used for analysis and nothing else. */ 2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intClipOpen( M4VSS3GPP_ClipContext *pClipCtxt, 2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_ClipSettings *pClipSettings, M4OSA_Bool bSkipAudioTrack, 2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool bFastOpenMode, M4OSA_Bool bAvoidOpeningVideoDec ) 2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4READER_MediaFamily mediaFamily; 2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_StreamHandler *pStreamHandler; 2196e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4_StreamHandler dummyStreamHandler; 2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 iDuration; 2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Void *decoderUserData; 2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS 2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4DECODER_MPEG4_DecoderConfigInfo dummy; 2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4DECODER_VideoSize videoSizeFromDSI; 2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */ 2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4DECODER_OutputFilter FilterOption; 2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check input parameters */ 2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == pClipCtxt), M4ERR_PARAMETER, 2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen: pClipCtxt is M4OSA_NULL"); 2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettings), M4ERR_PARAMETER, 2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen: pClipSettings is M4OSA_NULL"); 2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_2( 2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen: called with pClipCtxt: 0x%x, bAvoidOpeningVideoDec=0x%x", 2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt, bAvoidOpeningVideoDec); 2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Keep a pointer to the clip settings. Remember that we don't possess it! */ 2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pSettings = pClipSettings; 2436e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(M4VIDEOEDITING_kFileType_ARGB8888 == pClipCtxt->pSettings->FileType) { 2446e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE3_0("M4VSS3GPP_intClipOpen: Image stream; set current vid dec"); 2456e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = M4VSS3GPP_setCurrentVideoDecoder( 2466e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury &pClipCtxt->ShellAPI, M4DA_StreamTypeVideoARGB8888); 2476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4ERR_CHECK_RETURN(err); 2486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 2496e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury decoderUserData = M4OSA_NULL; 2506e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 2516e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctCreate( 252b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang &pClipCtxt->pViDecCtxt, 253b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang &dummyStreamHandler, 254b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pClipCtxt->ShellAPI.m_pReader, 255b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pClipCtxt->ShellAPI.m_pReaderDataIt, 256b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang &pClipCtxt->VideoAU, 2576e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury decoderUserData); 2586e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 2596e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if (M4NO_ERROR != err) { 2606e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intClipOpen: \ 2616e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury m_pVideoDecoder->m_pFctCreate returns 0x%x", err); 2626e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return err; 2636e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 2646e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury M4OSA_TRACE3_1("M4VSS3GPP_intClipOpen: \ 2656e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury Vid dec started; pViDecCtxt=0x%x", pClipCtxt->pViDecCtxt); 2666e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 2676e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury return M4NO_ERROR; 2686e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Get the correct reader interface */ 2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_setCurrentReader(&pClipCtxt->ShellAPI, 2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pSettings->FileType); 2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CHECK_RETURN(err); 2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Init the 3GPP or MP3 reader */ 2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = 2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->ShellAPI.m_pReader->m_pFctCreate(&pClipCtxt->pReaderContext); 2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctCreate returns 0x%x", 2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Link the reader interface to the reader context (used by the decoder to know the reader) */ 2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->ShellAPI.m_pReaderDataIt->m_readerContext = 2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext; 2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Set the OSAL read function set */ 2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReader->m_pFctSetOption( 2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext, 2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4READER_kOptionID_SetOsaFileReaderFctsPtr, 2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_DataOption)(pClipCtxt->pFileReadPtrFct)); 3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctSetOption returns 0x%x", 3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Set the fast open mode if asked (3GPP only) */ 3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4VIDEOEDITING_kFileType_3GPP == pClipCtxt->pSettings->FileType ) 3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_TRUE == bFastOpenMode ) 3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReader->m_pFctSetOption( 3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext, 3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4READER_3GP_kOptionID_FastOpenMode, M4OSA_NULL); 3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen():\ 3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_pReader->m_pFctSetOption(FastOpenMode) returns 0x%x", 3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Set the skip audio option if asked */ 3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_TRUE == bSkipAudioTrack ) 3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReader->m_pFctSetOption( 3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext, 3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4READER_3GP_kOptionID_VideoOnly, M4OSA_NULL); 3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctSetOption(VideoOnly) returns 0x%x", 3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 346cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong if (pClipCtxt->pSettings->FileType == M4VIDEOEDITING_kFileType_PCM) { 347cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong // Compose the temp filename with sample rate and channel information. 348cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong const char* freqStr = freqToString( 349cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong pClipCtxt->pSettings->ClipProperties.uiSamplingFrequency); 3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 351cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong if (freqStr == NULL) { 3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_WAR_INCOMPATIBLE_AUDIO_SAMPLING_FREQUENCY; 353cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong } 3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 355cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong const char* chanStr = channelToStringAndFileExt( 356cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong pClipCtxt->pSettings->ClipProperties.uiNbChannels); 3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 358cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong if (chanStr == NULL) { 359cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return M4VSS3GPP_WAR_INCOMPATIBLE_AUDIO_NB_OF_CHANNELS; 360cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong } 3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 362cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong // Allocate one byte more to hold the null terminator 363cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong M4OSA_UInt32 length = 364cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong strlen(pClipSettings->pFile) + strlen(freqStr) + strlen(chanStr) + 1; 365cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong 366cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong char* pTempFile = (char *) malloc(length); 367cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong if (pTempFile == NULL) { 368cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong M4OSA_TRACE1_1("M4VSS3GPP_intClipOpen(): malloc %d bytes fail",length); 369cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return M4ERR_ALLOC; 3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 371cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong memset(pTempFile, 0, length); 372cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong memcpy(pTempFile, pClipSettings->pFile, strlen(pClipSettings->pFile)); 373cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong strncat(pTempFile, freqStr, strlen(freqStr)); 374cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong strncat(pTempFile, chanStr, strlen(chanStr)); 3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReader->m_pFctOpen( pClipCtxt->pReaderContext, pTempFile); 377cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong if (pTempFile != NULL) { 378cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong free(pTempFile); 379cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong pTempFile = NULL; 380cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong } 381cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong if ( M4NO_ERROR != err ) { 382cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong M4OSA_TRACE1_1("M4VSS3GPP_intClipOpen(): open pcm file returns error : 0x%x", err); 383cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong return err; 384cafc53c0ac77c2aa7564cea26120da6bc0c589f2James Dong } 3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Open the 3GPP/MP3 clip file */ 3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReader->m_pFctOpen( pClipCtxt->pReaderContext, 3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipSettings->pFile); 3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 uiDummy, uiCoreId; 3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctOpen returns 0x%x", err); 3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If the error is from the core reader, we change it to a public VSS3GPP error */ 4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR_SPLIT(err, uiDummy, uiCoreId, uiDummy); 4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4MP4_READER == uiCoreId ) 4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen(): returning M4VSS3GPP_ERR_INVALID_3GPP_FILE"); 4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_INVALID_3GPP_FILE; 4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Get the audio and video streams */ 4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi while( err == M4NO_ERROR ) 4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReader->m_pFctGetNextStream( 4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext, &mediaFamily, &pStreamHandler); 4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*in case we found a BIFS stream or something else...*/ 4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( err == ((M4OSA_UInt32)M4ERR_READER_UNKNOWN_STREAM_TYPE)) 4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (err == ((M4OSA_UInt32)M4WAR_TOO_MUCH_STREAMS)) ) 4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4NO_ERROR; 4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi continue; 4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) /**< One stream found */ 4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Found a video stream */ 4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( mediaFamily == M4READER_kMediaFamilyVideo) 4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (M4OSA_NULL == pClipCtxt->pVideoStream) ) 4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( M4DA_StreamTypeVideoH263 == pStreamHandler->m_streamType) 4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4DA_StreamTypeVideoMpeg4 4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pStreamHandler->m_streamType) 4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4DA_StreamTypeVideoMpeg4Avc 4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pStreamHandler->m_streamType) ) 4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1( 4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen():\ 4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Found a H263 or MPEG-4 or H264 video stream in input 3gpp clip; %d", 4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamHandler->m_streamType); 4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Keep pointer to the video stream */ 4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pVideoStream = 4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_VideoStreamHandler *)pStreamHandler; 4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamHandler->m_bStreamIsOK = M4OSA_TRUE; 4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Reset the stream reader */ 4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReader->m_pFctReset( 4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext, 4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler *)pClipCtxt->pVideoStream); 4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctReset(video) returns 0x%x", 4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Initializes an access Unit */ 4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReader->m_pFctFillAuStruct( 4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext, 4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler *)pClipCtxt->pVideoStream, 4707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->VideoAU); 4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen():\ 4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_pReader->m_pFctFillAuStruct(video) returns 0x%x", 4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /**< Not H263 or MPEG-4 (H264, etc.) */ 4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS_editClipOpen():\ 4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Found an unsupported video stream (0x%x) in input 3gpp clip", 4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamHandler->m_streamType); 4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamHandler->m_bStreamIsOK = M4OSA_FALSE; 4897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Found an audio stream */ 4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( ( mediaFamily == M4READER_kMediaFamilyAudio) 4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (M4OSA_NULL == pClipCtxt->pAudioStream) ) 4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( M4DA_StreamTypeAudioAmrNarrowBand 4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pStreamHandler->m_streamType) 4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4DA_StreamTypeAudioAac == pStreamHandler->m_streamType) 4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4DA_StreamTypeAudioMp3 5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pStreamHandler->m_streamType) 5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4DA_StreamTypeAudioEvrc 5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pStreamHandler->m_streamType) 5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4DA_StreamTypeAudioPcm 5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pStreamHandler->m_streamType) ) 5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1( 5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen(): \ 5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Found an AMR-NB or AAC or MP3 audio stream in input clip; %d", 5097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamHandler->m_streamType); 5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Keep pointer to the audio stream */ 5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioStream = 5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_AudioStreamHandler *)pStreamHandler; 5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamHandler->m_bStreamIsOK = M4OSA_TRUE; 5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 5187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Reset the stream reader */ 5197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReader->m_pFctReset( 5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext, 5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler *)pClipCtxt->pAudioStream); 5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctReset(audio) returns 0x%x", 5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Initializes an access Unit */ 5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReader->m_pFctFillAuStruct( 5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext, 5357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler *)pClipCtxt->pAudioStream, 5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->AudioAU); 5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen():\ 5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_pReader->m_pFctFillAuStruct(audio) returns 0x%x", 5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 5457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /**< Not AMR-NB or AAC (AMR-WB...) */ 5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen():\ 5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Found an unsupported audio stream (0x%x) in input 3gpp/mp3 clip", 5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamHandler->m_streamType); 5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pStreamHandler->m_bStreamIsOK = M4OSA_FALSE; 5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( M4OSA_ERR_IS_ERROR(err) ) 5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 5617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctGetNextStream() returns 0x%x!", 5627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 5637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 5647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Init Video decoder */ 5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pClipCtxt->pVideoStream ) 5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS 5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* If external decoders are possible, it's best to avoid opening the decoder if the clip is only 5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi going to be used for analysis, as we're not going to use it for the analysis in the case of a 5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi possible external decoder anyway, and either there could be no decoder at this point or the HW 5757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoder could be present, which we want to avoid opening for that. See comments in 5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi intBuildAnalysis for more details. */ 5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* CHANGEME Temporarily only do this for MPEG4, since for now only MPEG4 external decoders are 5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi supported, and the following wouldn't work for H263 so a release where external decoders are 5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi possible, but not used, wouldn't work with H263 stuff. */ 5817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( bAvoidOpeningVideoDec && M4DA_StreamTypeVideoMpeg4 5837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pClipCtxt->pVideoStream->m_basicProperties.m_streamType ) 5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Oops! The mere act of opening the decoder also results in the image size being 5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi filled in the video stream! Compensate for this by using ParseVideoDSI to fill 5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi this info. */ 5887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0( 5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen: Mpeg4 stream; vid dec not started"); 5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4DECODER_EXTERNAL_ParseVideoDSI(pClipCtxt->pVideoStream-> 5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_basicProperties.m_pDecoderSpecificInfo, 5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pVideoStream-> 5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_basicProperties.m_decoderSpecificInfoSize, 5947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &dummy, &videoSizeFromDSI); 5957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pVideoStream->m_videoWidth = videoSizeFromDSI.m_uiWidth; 5977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pVideoStream->m_videoHeight = 5987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi videoSizeFromDSI.m_uiHeight; 5997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 6017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0( 6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen: Mp4/H263/H264 stream; set current vid dec"); 6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_setCurrentVideoDecoder(&pClipCtxt->ShellAPI, 6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pVideoStream->m_basicProperties.m_streamType); 6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CHECK_RETURN(err); 6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS 6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderUserData = 6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->ShellAPI.m_pCurrentVideoDecoderUserData; 6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderUserData = M4OSA_NULL; 6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctCreate( 6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->pViDecCtxt, 6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->pVideoStream->m_basicProperties, 625b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pClipCtxt->ShellAPI.m_pReader, 6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->ShellAPI.m_pReaderDataIt, 6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->VideoAU, decoderUserData); 6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( ((M4OSA_UInt32)M4ERR_DECODER_H263_PROFILE_NOT_SUPPORTED) == err) 6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (((M4OSA_UInt32)M4ERR_DECODER_H263_NOT_BASELINE) == err) ) 6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Our decoder is not compatible with H263 profile other than 0. 6347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * So it returns this internal error code. 6357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * We translate it to our own error code */ 6367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_H263_PROFILE_NOT_SUPPORTED; 6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( M4NO_ERROR != err ) 6397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 6417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen: m_pVideoDecoder->m_pFctCreate returns 0x%x", 6427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 6437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 6447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1( 6467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen: Vid dec started; pViDecCtxt=0x%x", 6477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pViDecCtxt); 6487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4DA_StreamTypeVideoMpeg4Avc 6507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pClipCtxt->pVideoStream->m_basicProperties.m_streamType ) 6517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi FilterOption.m_pFilterFunction = 6537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Void *) &M4VIFI_ResizeBilinearYUV420toYUV420; 6547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi FilterOption.m_pFilterUserData = M4OSA_NULL; 6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption( 6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pViDecCtxt, M4DECODER_kOptionID_OutputFilter, 6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_DataOption) &FilterOption); 6587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen: m_pVideoDecoder->m_pFctSetOption returns 0x%x", 6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 6647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0( 6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipOpen: m_pVideoDecoder->m_pFctSetOption\ 6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4DECODER_kOptionID_OutputFilter OK"); 6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS 6747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 6787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Init Audio decoder */ 6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pClipCtxt->pAudioStream ) 6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_intClipPrepareAudioDecoder(pClipCtxt); 6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CHECK_RETURN(err); 6877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1("M4VSS3GPP_intClipOpen: Audio dec started; context=0x%x", 6887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioDecCtxt); 6897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioAU.m_streamID = 0; 6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioAU.m_dataAddress = M4OSA_NULL; 6947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioAU.m_size = 0; 6957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioAU.m_CTS = 0; 6967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioAU.m_DTS = 0; 6977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioAU.m_attribute = 0; 6987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioAU.m_maxsize = 0; 6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioAU.m_structSize = sizeof(pClipCtxt->AudioAU); 7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Get the duration of the longest stream */ 7047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_TRUE == pClipCtxt->pSettings->ClipProperties.bAnalysed ) 7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* If already calculated set it to previous value */ 7077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Because fast open and full open can return a different value, 7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi it can mismatch user settings */ 7097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Video track is more important than audio track (if video track is shorter than 7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi audio track, it can led to cut larger than expected) */ 7117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iDuration = pClipCtxt->pSettings->ClipProperties.uiClipVideoDuration; 7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( iDuration == 0 ) 7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iDuration = pClipCtxt->pSettings->ClipProperties.uiClipDuration; 7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 7197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Else compute it from streams */ 7217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iDuration = 0; 7227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pClipCtxt->pVideoStream ) 7247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iDuration = (M4OSA_Int32)( 7267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pVideoStream->m_basicProperties.m_duration); 7277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( M4OSA_NULL != pClipCtxt->pAudioStream) && ((M4OSA_Int32)( 7307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioStream->m_basicProperties.m_duration) 7317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi > iDuration) && iDuration == 0 ) 7327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iDuration = (M4OSA_Int32)( 7347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioStream->m_basicProperties.m_duration); 7357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If end time is not used, we set it to the video track duration */ 7407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( 0 == pClipCtxt->pSettings->uiEndCutTime ) 7417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pSettings->uiEndCutTime = (M4OSA_UInt32)iDuration; 7437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7450e248c82803c7880a15ce29c2d4be5c2189e414cDanny Fernandes pClipCtxt->iEndTime = (M4OSA_Int32)pClipCtxt->pSettings->uiEndCutTime; 7467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return with no error */ 7497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intClipOpen(): returning M4NO_ERROR"); 7507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 7517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 7527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 7547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 7557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_Void M4VSS3GPP_intClipDeleteAudioTrack() 7567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Delete the audio track. Clip will be like if it had no audio track 7577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 7587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pClipCtxt (IN) Internal clip context 7597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 7607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 7617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_Void M4VSS3GPP_intClipDeleteAudioTrack( M4VSS3GPP_ClipContext *pClipCtxt ) 7627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 7637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * But we don't have to free the audio stream. It will be freed by the reader when closing it*/ 7657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioStream = M4OSA_NULL; 7667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * We will return a constant silence AMR AU. 7697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * We set it here once, instead of at each read audio step. */ 7707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioFramePtr = (M4OSA_MemAddr8)pClipCtxt->pSilenceFrameData; 7717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->uiAudioFrameSize = pClipCtxt->uiSilenceFrameSize; 7727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 7747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Free the decoded audio buffer (it needs to be re-allocated to store silence 7757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frame eventually)*/ 7767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pClipCtxt->AudioDecBufferOut.m_dataAddress ) 7777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 778694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(pClipCtxt->AudioDecBufferOut.m_dataAddress); 7797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioDecBufferOut.m_dataAddress = M4OSA_NULL; 7807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return; 7837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 7847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 7867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 7877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intClipDecodeVideoUpToCurrentTime() 7887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Jump to the previous RAP and decode up to the current video time 7897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pClipCtxt (IN) Internal clip context 7907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param iCts (IN) Target CTS 7917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 7927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 7937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intClipDecodeVideoUpToCts( M4VSS3GPP_ClipContext *pClipCtxt, 7947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 iCts ) 7957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 7967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 iRapCts, iClipCts; 7977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_MediaTime dDecodeTime; 7987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool bClipJump = M4OSA_FALSE; 7997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 8007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 8027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Compute the time in the clip base */ 8037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iClipCts = iCts - pClipCtxt->iVoffset; 8047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 8067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If we were reading the clip, we must jump to the previous RAP 8077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * to decode from that point. */ 8087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4VSS3GPP_kClipStatus_READ == pClipCtxt->Vstatus ) 8097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 811b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang * The decoder must be told to jump */ 812b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang bClipJump = M4OSA_TRUE; 813b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang pClipCtxt->iVideoDecCts = iClipCts; 8147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 8167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Remember the clip reading state */ 8177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->Vstatus = M4VSS3GPP_kClipStatus_DECODE_UP_TO; 8187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 8217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If we are in decodeUpTo() process, check if we need to do 8227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi one more step or if decoding is finished */ 8237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4VSS3GPP_kClipStatus_DECODE_UP_TO == pClipCtxt->Vstatus ) 8247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Do a step of 500 ms decoding */ 8267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iVideoDecCts += 500; 8277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pClipCtxt->iVideoDecCts > iClipCts ) 8297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Target time reached, we switch back to DECODE mode */ 8317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iVideoDecCts = iClipCts; 8327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->Vstatus = M4VSS3GPP_kClipStatus_DECODE; 8337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_1("c ,,,, decode up to : %ld", pClipCtxt->iVideoDecCts); 8367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 8387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Just decode at current clip cts */ 8407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iVideoDecCts = iClipCts; 8417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_1("d ,,,, decode up to : %ld", pClipCtxt->iVideoDecCts); 8437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 8467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Decode up to the target */ 8477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_2( 8487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipDecodeVideoUpToCts: Decoding upTo CTS %.3f, pClipCtxt=0x%x", 8497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi dDecodeTime, pClipCtxt); 8507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi dDecodeTime = (M4OSA_Double)pClipCtxt->iVideoDecCts; 8527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->isRenderDup = M4OSA_FALSE; 8537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = 8547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctDecode(pClipCtxt->pViDecCtxt, 855b3626dda1df18de2398d6c91647c9d544dd5f6dcChih-Chung Chang &dDecodeTime, bClipJump, 0); 8567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( M4NO_ERROR != err) && (M4WAR_NO_MORE_AU != err) 8587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (err != M4WAR_VIDEORENDERER_NO_NEW_FRAME) ) 8597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 8617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipDecodeVideoUpToCts: m_pFctDecode returns 0x%x!", 8627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 8637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 8647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( err == M4WAR_VIDEORENDERER_NO_NEW_FRAME ) 8677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->isRenderDup = M4OSA_TRUE; 8697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 8727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return */ 8737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intClipDecodeVideoUpToCts: returning M4NO_ERROR"); 8747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 8757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 8767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 8787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 8797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intClipReadNextAudioFrame() 8807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Read one AU frame in the clip 8817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 8827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pClipCtxt (IN) Internal clip context 8837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: No error 8847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 8857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 8867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intClipReadNextAudioFrame( 8877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_ClipContext *pClipCtxt ) 8887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 8897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 8907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ------------------------------ */ 8927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ---------- NO AUDIO ---------- */ 8937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ------------------------------ */ 8947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL == pClipCtxt->pAudioStream ) 8967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* If there is no audio track, we return silence AUs */ 8987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioFramePtr = 8997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr8)pClipCtxt->pSilenceFrameData; 9007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->uiAudioFrameSize = pClipCtxt->uiSilenceFrameSize; 9017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iAudioFrameCts += pClipCtxt->iSilenceFrameDuration; 9027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_0("b #### blank track"); 9047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ---------------------------------- */ 9077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ---------- AMR-NB, EVRC ---------- */ 9087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ---------------------------------- */ 9097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( ( M4VIDEOEDITING_kAMR_NB 9117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pClipCtxt->pSettings->ClipProperties.AudioStreamType) 9127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4VIDEOEDITING_kEVRC 9137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pClipCtxt->pSettings->ClipProperties.AudioStreamType) ) 9147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_FALSE == pClipCtxt->bAudioFrameAvailable ) 9167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * No AU available, so we must must read one from the original track reader */ 9197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( 9207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext, 9217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler *)pClipCtxt->pAudioStream, 9227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->AudioAU); 9237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) 9257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Set the current AMR frame position at the beginning of the read AU */ 9287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioFramePtr = pClipCtxt->AudioAU.m_dataAddress; 9297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Set the AMR frame CTS */ 9327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iAudioFrameCts = 9337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Int32)(pClipCtxt->AudioAU.m_CTS 9347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * pClipCtxt->scale_audio + 0.5); 9357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( ( M4WAR_NO_MORE_AU == err) && (M4VIDEOEDITING_kAMR_NB 9377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pClipCtxt->pSettings->ClipProperties.AudioStreamType) ) 9387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If there is less audio than the stream duration indicated, 9417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * we return silence at the end of the stream. */ 9427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioFramePtr = 9437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr8)pClipCtxt->pSilenceFrameData; 9447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->uiAudioFrameSize = pClipCtxt->uiSilenceFrameSize; 9457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iAudioFrameCts += pClipCtxt->iSilenceFrameDuration; 9467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_0("a #### silence AU"); 9487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return with M4WAR_NO_MORE_AU */ 9517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0( 9527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipReadNextAudioFrame()-AMR: \ 9537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4WAR_NO_MORE_AU (silence)"); 9547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_NO_MORE_AU; 9557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /**< fatal error (or no silence in EVRC) */ 9577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1( 9597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipReadNextAudioFrame()-AMR: m_pFctGetNextAu() returns 0x%x", 9607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 9617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 9627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /* bAudioFrameAvailable */ 9657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Go to the next AMR frame in the AU */ 9687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioFramePtr += pClipCtxt->uiAudioFrameSize; 9697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Increment CTS: one AMR frame is 20 ms long */ 9727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iAudioFrameCts += pClipCtxt->iSilenceFrameDuration; 9737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 9767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Get the size of the pointed AMR frame */ 9777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( pClipCtxt->pSettings->ClipProperties.AudioStreamType ) 9787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VIDEOEDITING_kAMR_NB: 9807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->uiAudioFrameSize = 9817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt16)M4VSS3GPP_intGetFrameSize_AMRNB( 9827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioFramePtr); 9837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 9847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4VIDEOEDITING_kEVRC: 9867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->uiAudioFrameSize = 9877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt16)M4VSS3GPP_intGetFrameSize_EVRC( 9887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioFramePtr); 9897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 9907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 9917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 9927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( 0 == pClipCtxt->uiAudioFrameSize ) 9957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0( 9977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipReadNextAudioFrame()-AMR: AU frame size == 0,\ 9987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AMR_AU"); 9997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AU; 10007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( pClipCtxt->uiAudioFrameSize > pClipCtxt->AudioAU.m_size ) 10027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0( 10047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipReadNextAudioFrame()-AMR: AU frame size greater than AU size!,\ 10057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AMR_AU"); 10067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AU; 10077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 10107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check if the end of the current AU has been reached or not */ 10117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( pClipCtxt->pAudioFramePtr + pClipCtxt->uiAudioFrameSize) 10127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi < (pClipCtxt->AudioAU.m_dataAddress + pClipCtxt->AudioAU.m_size) ) 10137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->bAudioFrameAvailable = M4OSA_TRUE; 10157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 10177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->bAudioFrameAvailable = 10197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FALSE; /**< will be used for next call */ 10207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ------------------------- */ 10247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ---------- AAC ---------- */ 10257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ------------------------- */ 10267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( ( M4VIDEOEDITING_kAAC 10287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pClipCtxt->pSettings->ClipProperties.AudioStreamType) 10297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4VIDEOEDITING_kAACplus 10307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pClipCtxt->pSettings->ClipProperties.AudioStreamType) 10317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4VIDEOEDITING_keAACplus 10327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pClipCtxt->pSettings->ClipProperties.AudioStreamType) ) 10337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( 10357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext, 10367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler *)pClipCtxt->pAudioStream, 10377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->AudioAU); 10387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) 10407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioFramePtr = pClipCtxt->AudioAU.m_dataAddress; 10427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->uiAudioFrameSize = 10437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt16)pClipCtxt->AudioAU.m_size; 10447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iAudioFrameCts = 10457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Int32)(pClipCtxt->AudioAU.m_CTS * pClipCtxt->scale_audio 10467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 0.5); 10477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Patch because m_CTS is unfortunately rounded in 3gp reader shell */ 10497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* (cts is not an integer with frequency 24 kHz for example) */ 10507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iAudioFrameCts = ( ( pClipCtxt->iAudioFrameCts 10517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + pClipCtxt->iSilenceFrameDuration / 2) 10527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi / pClipCtxt->iSilenceFrameDuration) 10537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * pClipCtxt->iSilenceFrameDuration; 10547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( M4WAR_NO_MORE_AU == err ) 10567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 10587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If there is less audio than the stream duration indicated, 10597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * we return silence at the end of the stream. */ 10607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioFramePtr = 10617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr8)pClipCtxt->pSilenceFrameData; 10627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->uiAudioFrameSize = pClipCtxt->uiSilenceFrameSize; 10637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iAudioFrameCts += pClipCtxt->iSilenceFrameDuration; 10647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_0("a #### silence AU"); 10667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 10687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return with M4WAR_NO_MORE_AU */ 10697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0( 10707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipReadNextAudioFrame()-AAC:\ 10717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returning M4WAR_NO_MORE_AU (silence)"); 10727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_NO_MORE_AU; 10737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /**< fatal error */ 10757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1( 10777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipReadNextAudioFrame()-AAC: m_pFctGetNextAu() returns 0x%x", 10787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 10797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 10807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* --------------------------------- */ 10847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ---------- MP3, others ---------- */ 10857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* --------------------------------- */ 10867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 10887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( 10907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext, 10917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler *)pClipCtxt->pAudioStream, 10927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->AudioAU); 10937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 10957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1( 10977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipReadNextAudioFrame()-MP3: m_pFctGetNextAu() returns 0x%x", 10987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 10997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 11007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioFramePtr = pClipCtxt->AudioAU.m_dataAddress; 11037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->uiAudioFrameSize = (M4OSA_UInt16)pClipCtxt->AudioAU.m_size; 11047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iAudioFrameCts = 11057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Int32)(pClipCtxt->AudioAU.m_CTS * pClipCtxt->scale_audio 11067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 0.5); 11077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 11107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return with no error */ 11117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0( 11127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipReadNextAudioFrame(): returning M4NO_ERROR"); 11137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 11157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 11167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 11187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 11197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intClipPrepareAudioDecoder() 11207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Creates and initialize the audio decoder for the clip. 11217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 11227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pClipCtxt (IN) internal clip context 11237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: No error 11247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 11257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 11267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_ERR M4VSS3GPP_intClipPrepareAudioDecoder( 11277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_ClipContext *pClipCtxt ) 11287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 11297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 11307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_StreamType audiotype; 11317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_SUPPORT_OMX_CODECS 11327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_AACType iAacType = 0; 11347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 11367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 11387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Set the proper audio decoder */ 11397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi audiotype = pClipCtxt->pAudioStream->m_basicProperties.m_streamType; 11417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi //EVRC 11437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4DA_StreamTypeAudioEvrc 11447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != audiotype ) /* decoder not supported yet, but allow to do null encoding */ 11457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_setCurrentAudioDecoder(&pClipCtxt->ShellAPI, audiotype); 11477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CHECK_RETURN(err); 11487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 11507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Creates the audio decoder */ 11517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL == pClipCtxt->ShellAPI.m_pAudioDecoder ) 11527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 11537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 11547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipPrepareAudioDecoder(): Fails to initiate the audio decoder."); 11557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4VSS3GPP_ERR_AUDIO_DECODER_INIT_FAILED; 11567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL == pClipCtxt->pAudioDecCtxt ) 11597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 11607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4VSS_SUPPORT_OMX_CODECS 11617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_TRUE == pClipCtxt->ShellAPI.bAllowFreeingOMXCodecInterface ) 11637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1164bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury if( M4DA_StreamTypeAudioAac == audiotype ) { 1165bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury err = M4VSS3GPP_intCheckAndGetCodecAacProperties( 1166bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt); 1167bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury } else if (M4DA_StreamTypeAudioPcm != audiotype) { 11687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctCreateAudioDec( 11697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->pAudioDecCtxt, pClipCtxt->pAudioStream, 1170bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4OSA_NULL); 1171bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury } else { 1172bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury err = M4NO_ERROR; 1173bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury } 11747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 11757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 11767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 11777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipPrepareAudioDecoder: m_pAudioDecoder->m_pFctCreateAudioDec\ 11787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi returns 0x%x", err); 11797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 11807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 11837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 11847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1( 11857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipPrepareAudioDecoder:\ 11867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Creating external audio decoder of type 0x%x", audiotype); 11877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* External OMX codecs are used*/ 11887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4DA_StreamTypeAudioAac == audiotype ) 11897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 11907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctCreateAudioDec( 11917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->pAudioDecCtxt, pClipCtxt->pAudioStream, 11927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->ShellAPI.pCurrentAudioDecoderUserData); 11937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR == err ) 11957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 11967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* AAC properties*/ 11977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*get from Reader; temporary, till Audio decoder shell API 11987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi available to get the AAC properties*/ 11997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AacProperties.aNumChan = 12007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioStream->m_nbChannels; 12017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AacProperties.aSampFreq = 12027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioStream->m_samplingFrequency; 12037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pAudioDecoder-> 12057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_pFctGetOptionAudioDec(pClipCtxt->pAudioDecCtxt, 12067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AD_kOptionID_StreamType, 12077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_DataOption) &iAacType); 12087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 12107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 12117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 12127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipPrepareAudioDecoder:\ 12137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_pAudioDecoder->m_pFctGetOptionAudioDec returns err 0x%x", err); 12147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iAacType = M4_kAAC; //set to default 12157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4NO_ERROR; 12167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else { 12187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1( 12197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipPrepareAudioDecoder: \ 12207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_pAudioDecoder->m_pFctGetOptionAudioDec returns streamType %d", 12217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iAacType); 12227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( iAacType ) 12247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 12257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4_kAAC: 12267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AacProperties.aSBRPresent = 0; 12277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AacProperties.aPSPresent = 0; 12287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 12297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4_kAACplus: 12317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AacProperties.aSBRPresent = 1; 12327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AacProperties.aPSPresent = 0; 12337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AacProperties.aExtensionSampFreq = 12347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioStream->m_samplingFrequency; 12357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 12367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4_keAACplus: 12387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AacProperties.aSBRPresent = 1; 12397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AacProperties.aPSPresent = 1; 12407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AacProperties.aExtensionSampFreq = 12417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioStream->m_samplingFrequency; 12427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 12437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 12447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 12457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_2( 12477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipPrepareAudioDecoder: AAC NBChans=%d, SamplFreq=%d", 12487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AacProperties.aNumChan, 12497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AacProperties.aSampFreq); 12507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 12537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctCreateAudioDec( 12547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->pAudioDecCtxt, pClipCtxt->pAudioStream, 12557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->ShellAPI.pCurrentAudioDecoderUserData); 12567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 12587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 12597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 12607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipPrepareAudioDecoder:\ 12617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_pAudioDecoder->m_pFctCreateAudioDec returns 0x%x", 12627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 12637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 12647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 12687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Trick, I use pUserData to retrieve aac properties, 12697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi waiting for some better implementation... */ 12707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4DA_StreamTypeAudioAac == audiotype ) 12727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctCreateAudioDec( 12737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->pAudioDecCtxt, 12747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioStream, &(pClipCtxt->AacProperties)); 12757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 12767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctCreateAudioDec( 12777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->pAudioDecCtxt, pClipCtxt->pAudioStream, 12787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_NULL /* to be changed with HW interfaces */); 12797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 12817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 12827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 12837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipPrepareAudioDecoder:\ 12847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_pAudioDecoder->m_pFctCreateAudioDec returns 0x%x", 12857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 12867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 12877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 12907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4DA_StreamTypeAudioAmrNarrowBand == audiotype ) { 12947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* AMR DECODER CONFIGURATION */ 12957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* nothing specific to do */ 12977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( M4DA_StreamTypeAudioEvrc == audiotype ) { 12997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* EVRC DECODER CONFIGURATION */ 13007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* nothing specific to do */ 13027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( M4DA_StreamTypeAudioMp3 == audiotype ) { 13047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* MP3 DECODER CONFIGURATION */ 13057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* nothing specific to do */ 13077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if( M4DA_StreamTypeAudioAac == audiotype ) 13097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* AAC DECODER CONFIGURATION */ 13117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Decode high quality aac but disable PS and SBR */ 13137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Because we have to mix different kind of AAC so we must take the lowest capability */ 13147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* In MCS it was not needed because there is only one stream */ 13157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4_AacDecoderConfig AacDecParam; 13167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi AacDecParam.m_AACDecoderProfile = AAC_kAAC; 13187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi AacDecParam.m_DownSamplingMode = AAC_kDS_OFF; 13197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4ENCODER_kMono == pClipCtxt->pAudioStream->m_nbChannels ) 13217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi AacDecParam.m_OutputMode = AAC_kMono; 13237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 13257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi AacDecParam.m_OutputMode = AAC_kStereo; 13277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctSetOptionAudioDec( 13307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioDecCtxt, 13317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AD_kOptionID_UserParam, (M4OSA_DataOption) &AacDecParam); 13327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1334bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury if( M4OSA_NULL != pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctSetOptionAudioDec ) { 1335bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctSetOptionAudioDec( 1336bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioDecCtxt, M4AD_kOptionID_3gpReaderInterface, 1337bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury (M4OSA_DataOption) pClipCtxt->ShellAPI.m_pReaderDataIt); 1338bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 1339bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctSetOptionAudioDec( 1340bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioDecCtxt, M4AD_kOptionID_AudioAU, 1341bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury (M4OSA_DataOption) &pClipCtxt->AudioAU); 1342bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury } 1343bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 13447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStartAudioDec ) 13457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Not implemented in all decoders */ 13477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStartAudioDec( 13487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioDecCtxt); 13497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 13517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 13537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipPrepareAudioDecoder:\ 13547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_pAudioDecoder->m_pFctStartAudioDec returns 0x%x", 13557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 13567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 13577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 13617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Allocate output buffer for the audio decoder */ 13627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioDecBufferOut.m_bufferSize = 13637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioStream->m_byteFrameLength 13647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * pClipCtxt->pAudioStream->m_byteSampleSize 13657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * pClipCtxt->pAudioStream->m_nbChannels; 13667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioDecBufferOut.m_dataAddress = 1367694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pClipCtxt->AudioDecBufferOut.m_bufferSize 13687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_Int16), 13697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP, (M4OSA_Char *)"AudioDecBufferOut.m_bufferSize"); 13707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL == pClipCtxt->AudioDecBufferOut.m_dataAddress ) 13727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 13747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipPrepareAudioDecoder():\ 13757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi unable to allocate AudioDecBufferOut.m_dataAddress, returning M4ERR_ALLOC"); 13767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 13777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 13807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 13817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 13837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 13847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intClipDecodeCurrentAudioFrame() 13857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Decode the current AUDIO frame. 13867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 13877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pClipCtxt (IN) internal clip context 13887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: No error 13897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 13907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 13917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intClipDecodeCurrentAudioFrame( 13927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_ClipContext *pClipCtxt ) 13937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 13947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 13957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 13977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Silence mode */ 13987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pClipCtxt->pSilenceFrameData 13997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == (M4OSA_UInt8 *)pClipCtxt->pAudioFramePtr ) 14007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 14017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( pClipCtxt->AudioDecBufferOut.m_dataAddress == M4OSA_NULL ) 14027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 14037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 14047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Allocate output buffer for the audio decoder */ 14057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioDecBufferOut.m_bufferSize = 14067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->uiSilencePcmSize; 14077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioDecBufferOut.m_dataAddress = 1408694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc( 14097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioDecBufferOut.m_bufferSize 14107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_Int16), 14117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP,(M4OSA_Char *) "AudioDecBufferOut.m_bufferSize"); 14127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL == pClipCtxt->AudioDecBufferOut.m_dataAddress ) 14147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 14157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 14167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipDecodeCurrentAudioFrame():\ 14177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi unable to allocate AudioDecBufferOut.m_dataAddress, returning M4ERR_ALLOC"); 14187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 14197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 14207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 14217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Fill it with 0 (= pcm silence) */ 142332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memset(pClipCtxt->AudioDecBufferOut.m_dataAddress,0, 142432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu pClipCtxt->AudioDecBufferOut.m_bufferSize * sizeof(M4OSA_Int16)); 14257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 14267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (pClipCtxt->pSettings->FileType == M4VIDEOEDITING_kFileType_PCM) 14277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 14287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioDecBufferIn.m_dataAddress = (M4OSA_MemAddr8) pClipCtxt->pAudioFramePtr; 14297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioDecBufferIn.m_bufferSize = pClipCtxt->uiAudioFrameSize; 14307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 143132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)pClipCtxt->AudioDecBufferOut.m_dataAddress, 143232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)pClipCtxt->AudioDecBufferIn.m_dataAddress, pClipCtxt->AudioDecBufferIn.m_bufferSize); 14337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioDecBufferOut.m_bufferSize = pClipCtxt->AudioDecBufferIn.m_bufferSize; 14347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 14357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return with no error */ 14367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intClipDecodeCurrentAudioFrame(): returning M4NO_ERROR"); 14387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 14397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 14407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 14417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Standard decoding mode */ 14427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 14437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 14447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 14457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Decode current AMR frame */ 1446bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury if ( pClipCtxt->pAudioFramePtr != M4OSA_NULL ) { 1447bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->AudioDecBufferIn.m_dataAddress = 1448bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury (M4OSA_MemAddr8)pClipCtxt->pAudioFramePtr; 1449bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->AudioDecBufferIn.m_bufferSize = 1450bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->uiAudioFrameSize; 1451bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->AudioDecBufferIn.m_timeStampUs = 1452bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury (int64_t) (pClipCtxt->iAudioFrameCts * 1000LL); 1453bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 1454bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStepAudioDec( 1455bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioDecCtxt, 1456bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury &pClipCtxt->AudioDecBufferIn, &pClipCtxt->AudioDecBufferOut, 1457bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4OSA_FALSE); 1458bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury } else { 1459bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury // Pass Null input buffer 1460bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury // Reader invoked from Audio decoder source 1461bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStepAudioDec( 1462bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioDecCtxt, 1463bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4OSA_NULL, &pClipCtxt->AudioDecBufferOut, 1464bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4OSA_FALSE); 1465bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury } 14667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 14687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 14697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 14707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipDecodeCurrentAudioFrame():\ 14717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi m_pAudioDecoder->m_pFctStepAudio returns 0x%x", 14727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 14737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 14747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 14757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 14767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 14787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return with no error */ 14797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0( 14807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipDecodeCurrentAudioFrame(): returning M4NO_ERROR"); 14817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 14827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 14837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 14857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 14867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intClipJumpAudioAt() 14877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Jump in the audio track of the clip. 14887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 14897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pClipCtxt (IN) internal clip context 14907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pJumpCts (IN/OUT) in:target CTS, out: reached CTS 14917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: No error 14927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 14937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 14947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intClipJumpAudioAt( M4VSS3GPP_ClipContext *pClipCtxt, 14957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 *pJumpCts ) 14967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 14977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 14987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 iTargetCts; 14997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 iJumpCtsMs; 15007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 15027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check input parameters */ 15037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == pClipCtxt), M4ERR_PARAMETER, 15047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipJumpAudioAt: pClipCtxt is M4OSA_NULL"); 15057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == pJumpCts), M4ERR_PARAMETER, 15067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipJumpAudioAt: pJumpCts is M4OSA_NULL"); 15077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iTargetCts = *pJumpCts; 15097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 15117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If there is no audio stream, we simulate a jump at the target jump CTS */ 15127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL == pClipCtxt->pAudioStream ) 15137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 15147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 15157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * the target CTS will be reached at next ReadFrame call (thus the -20) */ 15167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pJumpCts = iTargetCts - pClipCtxt->iSilenceFrameDuration; 15177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Patch because m_CTS is unfortunately rounded in 3gp reader shell */ 15197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* (cts is not an integer with frequency 24 kHz for example) */ 15207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pJumpCts = ( ( *pJumpCts + pClipCtxt->iSilenceFrameDuration / 2) 15217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi / pClipCtxt->iSilenceFrameDuration) 15227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * pClipCtxt->iSilenceFrameDuration; 15237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iAudioFrameCts = 15247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 15257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pJumpCts; /* simulate a read at jump position for later silence AUs */ 15267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 15277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 15287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 15297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 current_time = 0; 15307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 loop_counter = 0; 15317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( (M4DA_StreamTypeAudioMp3 15337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pClipCtxt->pAudioStream->m_basicProperties.m_streamType) ) 15347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 15357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi while( ( loop_counter < M4VSS3GPP_MP3_JUMPED_AU_NUMBER_MAX) 15367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (current_time < iTargetCts) ) 15377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 15387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( 15397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext, 15407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler *)pClipCtxt->pAudioStream, 15417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &pClipCtxt->AudioAU); 15427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 15447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 15457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1( 15467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipJumpAudioAt: m_pFctGetNextAu() returns 0x%x", 15477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 15487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 15497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 15507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi current_time = (M4OSA_Int32)pClipCtxt->AudioAU.m_CTS; 15527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi loop_counter++; 15537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 15547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 15567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * The current AU is stored */ 15577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioFramePtr = pClipCtxt->AudioAU.m_dataAddress; 15587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->uiAudioFrameSize = 15597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt16)pClipCtxt->AudioAU.m_size; 15607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iAudioFrameCts = 15617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Int32)(pClipCtxt->AudioAU.m_CTS * pClipCtxt->scale_audio 15627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 0.5); 15637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pJumpCts = pClipCtxt->iAudioFrameCts; 15657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 15667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 15677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 15687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 15697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Jump in the audio stream */ 15707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi iJumpCtsMs = 15717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Int32)(*pJumpCts / pClipCtxt->scale_audio + 0.5); 15727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReader->m_pFctJump( 15747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext, 15757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4_StreamHandler *)pClipCtxt->pAudioStream, 15767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &iJumpCtsMs); 15777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 15797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 15807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 15817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipJumpAudioAt(): m_pFctJump() returns 0x%x", 15827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 15837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 15847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 15857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pJumpCts = 15877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Int32)(iJumpCtsMs * pClipCtxt->scale_audio + 0.5); 15887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Patch because m_CTS is unfortunately rounded in 3gp reader shell */ 15907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* (cts is not an integer with frequency 24 kHz for example) */ 15917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pJumpCts = ( ( *pJumpCts + pClipCtxt->iSilenceFrameDuration / 2) 15927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi / pClipCtxt->iSilenceFrameDuration) 15937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * pClipCtxt->iSilenceFrameDuration; 15947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->iAudioFrameCts = 0; /* No frame read yet */ 15957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 15977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * To detect some may-be bugs, I prefer to reset all these after a jump */ 15987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->bAudioFrameAvailable = M4OSA_FALSE; 15997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioFramePtr = M4OSA_NULL; 16007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 16027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * In AMR, we have to manage multi-framed AUs, 16037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi but also in AAC the jump can be 1 AU too much backward */ 16047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( *pJumpCts < iTargetCts ) 16057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 16067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 16077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Jump doesn't read any AU, we must read at least one */ 16087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_intClipReadNextAudioFrame(pClipCtxt); 16097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_ERR_IS_ERROR(err) ) 16117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 16127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 16137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipJumpAudioAt():\ 16147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intClipReadNextAudioFrame(a) returns 0x%x", 16157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 16167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 16177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 16207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Read AU frames as long as we reach the AU before the target CTS 16217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (so the target will be reached when the user call ReadNextAudioFrame). */ 16227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi while( pClipCtxt->iAudioFrameCts 16237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi < (iTargetCts - pClipCtxt->iSilenceFrameDuration) ) 16247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 16257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4VSS3GPP_intClipReadNextAudioFrame(pClipCtxt); 16267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_ERR_IS_ERROR(err) ) 16287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 16297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 16307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipJumpAudioAt():\ 16317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_intClipReadNextAudioFrame(b) returns 0x%x", 16327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 16337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 16347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 16387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return the CTS that will be reached at next ReadFrame */ 16397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pJumpCts = pClipCtxt->iAudioFrameCts 16407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + pClipCtxt->iSilenceFrameDuration; 16417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 16467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return with no error */ 16477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0("M4VSS3GPP_intClipJumpAudioAt(): returning M4NO_ERROR"); 16487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 16497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 16507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 16527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 16537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4VSS3GPP_intClipClose() 16547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Close a clip. Destroy the context. 16557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 16567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pClipCtxt (IN) Internal clip context 16577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: No error 16587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 16597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 16607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intClipClose( M4VSS3GPP_ClipContext *pClipCtxt ) 16617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 16627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err; 16637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 16657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check input parameters */ 16667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == pClipCtxt), M4ERR_PARAMETER, 16677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipClose: pClipCtxt is M4OSA_NULL"); 16687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 16707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Free the video decoder context */ 16717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pClipCtxt->pViDecCtxt ) 16727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 16737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctDestroy( 16747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pViDecCtxt); 16757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pViDecCtxt = M4OSA_NULL; 16767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 16797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Free the audio decoder context */ 16807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pClipCtxt->pAudioDecCtxt ) 16817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 16827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctDestroyAudioDec( 16837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioDecCtxt); 16847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 16867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 16877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 16887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipClose: m_pAudioDecoder->m_pFctDestroyAudioDec returns 0x%x", 16897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 16907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< don't return, we still have stuff to free */ 16917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioDecCtxt = M4OSA_NULL; 16947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 16977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Free the decoded audio buffer */ 16987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pClipCtxt->AudioDecBufferOut.m_dataAddress ) 16997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1700694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(pClipCtxt->AudioDecBufferOut.m_dataAddress); 17017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioDecBufferOut.m_dataAddress = M4OSA_NULL; 17027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 17037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 17057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Audio AU is allocated by reader. 17067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If no audio track, audio AU is set at 'silent' (SID) by VSS. 17077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * As a consequence, if audio AU is set to 'silent' (static) 17087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi it can't be free unless it is set to NULL */ 17097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( (M4OSA_MemAddr8)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048 17107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pClipCtxt->AudioAU.m_dataAddress) 17117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || ((M4OSA_MemAddr8)pClipCtxt->pSilenceFrameData 17127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pClipCtxt->AudioAU.m_dataAddress) ) 17137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 17147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioAU.m_dataAddress = M4OSA_NULL; 17157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 17167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pClipCtxt->pReaderContext ) 17187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 17197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 17207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Close the 3GPP or MP3 reader */ 17217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReader->m_pFctClose( 17227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext); 17237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 17257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 17267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 17277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipClose(): m_pReader->m_pFctClose returns 0x%x", 17287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 17297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 17307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 17327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Destroy the 3GPP or MP3 reader context */ 17337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = pClipCtxt->ShellAPI.m_pReader->m_pFctDestroy( 17347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext); 17357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 17377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 17387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 17397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipClose(): m_pReader->m_pFctDestroy returns 0x%x", 17407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 17417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 17427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext = M4OSA_NULL; 17447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 17457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 17477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Return with no error */ 17487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1("M4VSS3GPP_intClipClose(Ctxt=0x%x): returning M4NO_ERROR", 17497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt); 17507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 17517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 17527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4VSS3GPP_intClipCleanUp( M4VSS3GPP_ClipContext *pClipCtxt ) 17547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 17557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR, err2; 17567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 17587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Check input parameters */ 17597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2((M4OSA_NULL == pClipCtxt), M4ERR_PARAMETER, 17607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipCleanUp: pClipCtxt is M4OSA_NULL"); 17617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 17637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Free the video decoder context */ 17647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pClipCtxt->pViDecCtxt ) 17657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 17667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctDestroy( 17677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pViDecCtxt); 17687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pViDecCtxt = M4OSA_NULL; 17697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 17707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 17727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Free the audio decoder context */ 17737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pClipCtxt->pAudioDecCtxt ) 17747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 17757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err2 = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctDestroyAudioDec( 17767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioDecCtxt); 17777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err2 ) 17797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 17807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 17817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipCleanUp: m_pAudioDecoder->m_pFctDestroyAudioDec returns 0x%x", 17827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 17837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< don't return, we still have stuff to free */ 17847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 17857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = err2; 17867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 17877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pAudioDecCtxt = M4OSA_NULL; 17897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 17907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 17927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Free the decoded audio buffer */ 17937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pClipCtxt->AudioDecBufferOut.m_dataAddress ) 17947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1795694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(pClipCtxt->AudioDecBufferOut.m_dataAddress); 17967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioDecBufferOut.m_dataAddress = M4OSA_NULL; 17977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 17987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 18007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Audio AU is allocated by reader. 18017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If no audio track, audio AU is set at 'silent' (SID) by VSS. 18027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * As a consequence, if audio AU is set to 'silent' (static) 18037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi it can't be free unless it is set to NULL */ 18047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ( (M4OSA_MemAddr8)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048 18057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pClipCtxt->AudioAU.m_dataAddress) 18067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || ((M4OSA_MemAddr8)pClipCtxt->pSilenceFrameData 18077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == pClipCtxt->AudioAU.m_dataAddress) ) 18087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->AudioAU.m_dataAddress = M4OSA_NULL; 18107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_NULL != pClipCtxt->pReaderContext ) 18137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 18157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Close the 3GPP or MP3 reader */ 18167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err2 = pClipCtxt->ShellAPI.m_pReader->m_pFctClose( 18177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext); 18187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err2 ) 18207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 18227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipCleanUp(): m_pReader->m_pFctClose returns 0x%x", 18237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 18247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 18267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = err2; 18277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 18307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Destroy the 3GPP or MP3 reader context */ 18317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err2 = pClipCtxt->ShellAPI.m_pReader->m_pFctDestroy( 18327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext); 18337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err2 ) 18357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 18377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intClipCleanUp(): m_pReader->m_pFctDestroy returns 0x%x", 18387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 18397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4NO_ERROR != err ) 18417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = err2; 18427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pClipCtxt->pReaderContext = M4OSA_NULL; 18457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18476e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(pClipCtxt->pPlaneYuv != M4OSA_NULL) { 18486e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(pClipCtxt->pPlaneYuv[0].pac_data != M4OSA_NULL) { 18496e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuv[0].pac_data); 18506e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv[0].pac_data = M4OSA_NULL; 18516e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 18526e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuv); 18536e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuv = M4OSA_NULL; 18546e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 18556e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury 18566e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(pClipCtxt->pPlaneYuvWithEffect != M4OSA_NULL) { 18576e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury if(pClipCtxt->pPlaneYuvWithEffect[0].pac_data != M4OSA_NULL) { 18586e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuvWithEffect[0].pac_data); 18596e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect[0].pac_data = M4OSA_NULL; 18606e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 18616e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury free(pClipCtxt->pPlaneYuvWithEffect); 18626e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury pClipCtxt->pPlaneYuvWithEffect = M4OSA_NULL; 18636e779fda8a4f6258f9b910290b2f296d18fb2585Rajneesh Chowdury } 18647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 18657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Free the shells interfaces */ 18667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_unRegisterAllWriters(&pClipCtxt->ShellAPI); 18677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_unRegisterAllEncoders(&pClipCtxt->ShellAPI); 18687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_unRegisterAllReaders(&pClipCtxt->ShellAPI); 18697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4VSS3GPP_unRegisterAllDecoders(&pClipCtxt->ShellAPI); 18707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1("M4VSS3GPP_intClipCleanUp: pClipCtxt=0x%x", pClipCtxt); 18727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 18737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Free the clip context */ 1874694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(pClipCtxt); 18757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 18777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 18787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 18807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 18817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_UInt32 M4VSS3GPP_intGetFrameSize_AMRNB() 18827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Return the length, in bytes, of the AMR Narrow-Band frame contained in the given buffer 18837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 18847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pAudioFrame (IN) AMRNB frame 18857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: No error 18867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 18877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 18887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_UInt32 M4VSS3GPP_intGetFrameSize_AMRNB( M4OSA_MemAddr8 pAudioFrame ) 18907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 18917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 frameSize = 0; 18927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 frameType = ( ( *pAudioFrame) &(0xF << 3)) >> 3; 18937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( frameType ) 18957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 0: 18977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 95; 18987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* 4750 bps */ 18997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 1: 19017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 103; 19027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* 5150 bps */ 19037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 2: 19057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 118; 19067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* 5900 bps */ 19077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 3: 19097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 134; 19107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* 6700 bps */ 19117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 4: 19137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 148; 19147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* 7400 bps */ 19157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 5: 19177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 159; 19187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* 7950 bps */ 19197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 6: 19217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 204; 19227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* 10200 bps */ 19237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 7: 19257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 244; 19267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* 12000 bps */ 19277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 8: 19297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 39; 19307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* SID (Silence) */ 19317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 15: 19337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 0; 19347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* No data */ 19357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 19377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0( 19387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intGetFrameSize_AMRNB(): Corrupted AMR frame! returning 0."); 19397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return 0; 19407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 19417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return (1 + (( frameSize + 7) / 8)); 19437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 19447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 19467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 19477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_UInt32 M4VSS3GPP_intGetFrameSize_EVRC() 19487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Return the length, in bytes, of the EVRC frame contained in the given buffer 19497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note 19507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 0 1 2 3 19517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * +-+-+-+-+ 19527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * |fr type| RFC 3558 19537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * +-+-+-+-+ 19547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 19557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Frame Type: 4 bits 19567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * The frame type indicates the type of the corresponding codec data 19577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * frame in the RTP packet. 19587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 19597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * For EVRC and SMV codecs, the frame type values and size of the 19607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * associated codec data frame are described in the table below: 19617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 19627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Value Rate Total codec data frame size (in octets) 19637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * --------------------------------------------------------- 19647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 0 Blank 0 (0 bit) 19657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 1 1/8 2 (16 bits) 19667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 2 1/4 5 (40 bits; not valid for EVRC) 19677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 3 1/2 10 (80 bits) 19687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 4 1 22 (171 bits; 5 padded at end with zeros) 19697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 5 Erasure 0 (SHOULD NOT be transmitted by sender) 19707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 19717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pCpAudioFrame (IN) EVRC frame 19727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: No error 19737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 19747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 19757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_UInt32 M4VSS3GPP_intGetFrameSize_EVRC( M4OSA_MemAddr8 pAudioFrame ) 19767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 19777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 frameSize = 0; 19787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 frameType = ( *pAudioFrame) &0x0F; 19797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( frameType ) 19817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 19827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 0: 19837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 0; 19847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* blank */ 19857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 1: 19877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 16; 19887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* 1/8 */ 19897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 2: 19917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 40; 19927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* 1/4 */ 19937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 3: 19957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 80; 19967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* 1/2 */ 19977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 4: 19997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 171; 20007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* 1 */ 20017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case 5: 20037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi frameSize = 0; 20047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; /* erasure */ 20057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 20077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_0( 20087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4VSS3GPP_intGetFrameSize_EVRC(): Corrupted EVRC frame! returning 0."); 20097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return 0; 20107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 20117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return (1 + (( frameSize + 7) / 8)); 20137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 2014bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2015bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh ChowduryM4OSA_ERR M4VSS3GPP_intCheckAndGetCodecAacProperties( 2016bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4VSS3GPP_ClipContext *pClipCtxt) { 2017bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2018bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4OSA_ERR err = M4NO_ERROR; 2019bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4AD_Buffer outputBuffer; 2020bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury uint32_t optionValue =0; 2021bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2022bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury // Decode first audio frame from clip to get properties from codec 2023bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2024bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctCreateAudioDec( 2025bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury &pClipCtxt->pAudioDecCtxt, 2026bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioStream, &(pClipCtxt->AacProperties)); 2027bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2028bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctSetOptionAudioDec( 2029bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioDecCtxt, M4AD_kOptionID_3gpReaderInterface, 2030bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury (M4OSA_DataOption) pClipCtxt->ShellAPI.m_pReaderDataIt); 2031bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2032bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctSetOptionAudioDec( 2033bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioDecCtxt, M4AD_kOptionID_AudioAU, 2034bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury (M4OSA_DataOption) &pClipCtxt->AudioAU); 2035bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2036bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury if( pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStartAudioDec != M4OSA_NULL ) { 2037bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2038bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStartAudioDec( 2039bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioDecCtxt); 2040bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury if( M4NO_ERROR != err ) { 2041bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2042bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4OSA_TRACE1_1( 2043bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury "M4VSS3GPP_intCheckAndGetCodecAacProperties: \ 2044bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury m_pFctStartAudioDec returns 0x%x", err); 2045bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury return err; 2046bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury } 2047bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury } 2048bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2049bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury /** 2050bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury * Allocate output buffer for the audio decoder */ 2051bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury outputBuffer.m_bufferSize = 2052bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioStream->m_byteFrameLength 2053bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury * pClipCtxt->pAudioStream->m_byteSampleSize 2054bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury * pClipCtxt->pAudioStream->m_nbChannels; 2055bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2056bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury if( outputBuffer.m_bufferSize > 0 ) { 2057bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2058bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury outputBuffer.m_dataAddress = 2059bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(outputBuffer.m_bufferSize \ 2060bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury *sizeof(short), M4VSS3GPP, (M4OSA_Char *)"outputBuffer.m_bufferSize"); 2061bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2062bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury if( M4OSA_NULL == outputBuffer.m_dataAddress ) { 2063bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2064bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4OSA_TRACE1_0( 2065bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury "M4VSS3GPP_intCheckAndGetCodecAacProperties():\ 2066bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury unable to allocate outputBuffer.m_dataAddress"); 2067bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury return M4ERR_ALLOC; 2068bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury } 2069bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury } 2070bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2071bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStepAudioDec( 2072bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioDecCtxt, M4OSA_NULL, &outputBuffer, M4OSA_FALSE); 2073bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2074bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury if ( err == M4WAR_INFO_FORMAT_CHANGE ) { 2075bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2076bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury // Get the properties from codec node 2077bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctGetOptionAudioDec( 2078bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioDecCtxt, 2079bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4AD_kOptionID_AudioNbChannels, (M4OSA_DataOption) &optionValue); 2080bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2081bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->AacProperties.aNumChan = optionValue; 2082bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury // Reset Reader structure value also 2083bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioStream->m_nbChannels = optionValue; 2084bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2085bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctGetOptionAudioDec( 2086bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioDecCtxt, 2087bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4AD_kOptionID_AudioSampFrequency, (M4OSA_DataOption) &optionValue); 2088bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2089bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->AacProperties.aSampFreq = optionValue; 2090bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury // Reset Reader structure value also 2091bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pAudioStream->m_samplingFrequency = optionValue; 2092bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2093bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury } else if( err != M4NO_ERROR) { 2094bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intCheckAndGetCodecAacProperties:\ 2095bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury m_pFctStepAudioDec returns err = 0x%x", err); 2096bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury } 2097bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2098bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury free(outputBuffer.m_dataAddress); 2099bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2100bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury // Reset the stream reader 2101bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury err = pClipCtxt->ShellAPI.m_pReader->m_pFctReset( 2102bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury pClipCtxt->pReaderContext, 2103bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury (M4_StreamHandler *)pClipCtxt->pAudioStream); 2104bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2105bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury if (M4NO_ERROR != err) { 2106bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury M4OSA_TRACE1_1("M4VSS3GPP_intCheckAndGetCodecAacProperties\ 2107bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury Error in reseting reader: 0x%x", err); 2108bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury } 2109bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2110bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury return err; 2111bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury 2112bc8e52dadeb078c45e62ebda17fd95e67f689654Rajneesh Chowdury} 2113