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