diff options
Diffstat (limited to 'libvideoeditor/vss/src/M4READER_Pcm.c')
-rwxr-xr-x | libvideoeditor/vss/src/M4READER_Pcm.c | 720 |
1 files changed, 0 insertions, 720 deletions
diff --git a/libvideoeditor/vss/src/M4READER_Pcm.c b/libvideoeditor/vss/src/M4READER_Pcm.c deleted file mode 100755 index 392367f..0000000 --- a/libvideoeditor/vss/src/M4READER_Pcm.c +++ /dev/null @@ -1,720 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - ************************************************************************ - * @file M4READER_Wav.c - * @brief Generic encapsulation of the core pcm reader - * @note This file implements the generic M4READER interface - * on top of the PCM reader - ************************************************************************ -*/ - -#include "M4OSA_Types.h" -#include "M4OSA_Error.h" -#include "M4OSA_Memory.h" -#include "M4OSA_Debug.h" -#include "M4OSA_CoreID.h" -#include "M4TOOL_VersionInfo.h" -#include "M4PCMR_CoreReader.h" -#include "M4READER_Pcm.h" -/** - ************************************************************************ - * structure M4READER_WAV_Context - * @brief This structure defines the internal context of a wav reader instance - * @note The context is allocated and de-allocated by the reader - ************************************************************************ - */ -typedef struct _M4READER_PCM_Context -{ - M4OSA_Context m_coreContext; /**< core wav reader context */ - M4_StreamHandler* m_pAudioStream; /**< pointer on the audio stream description - returned by the core */ - M4SYS_AccessUnit m_audioAu; /**< audio access unit to be filled by the core */ - M4OSA_FileReadPointer* m_pOsaFileReaderFcts; /**< OSAL file read functions */ - -} M4READER_PCM_Context; - - -/** - ************************************************************************ - * @brief Creates a wav reader instance - * @note allocates the context - * @param pContext: (OUT) Pointer to a wav reader context - * @return M4NO_ERROR: there is no error - * @return M4ERR_ALLOC: a memory allocation has failed - * @return M4ERR_PARAMETER: at least one parameter is not properly set (in DEBUG only) - ************************************************************************ - */ -M4OSA_ERR M4READER_PCM_create(M4OSA_Context* pContext) -{ - M4READER_PCM_Context* pReaderContext; - - M4OSA_DEBUG_IF1((pContext == 0), M4ERR_PARAMETER, - "M4READER_PCM_create: invalid context pointer"); - - pReaderContext = (M4READER_PCM_Context*)M4OSA_32bitAlignedMalloc(sizeof(M4READER_PCM_Context), - M4READER_WAV, (M4OSA_Char *)"M4READER_PCM_Context"); - if (pReaderContext == M4OSA_NULL) - { - return M4ERR_ALLOC; - } - - pReaderContext->m_coreContext = M4OSA_NULL; - pReaderContext->m_pAudioStream = M4OSA_NULL; - pReaderContext->m_audioAu.dataAddress = M4OSA_NULL; - pReaderContext->m_pOsaFileReaderFcts = M4OSA_NULL; - - *pContext = pReaderContext; - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * @brief Destroy the instance of the reader - * @note the context is un-allocated - * @param context: (IN) context of the network reader - * @return M4NO_ERROR: there is no error - * @return M4ERR_PARAMETER: at least one parameter is not properly set (in DEBUG only) - ************************************************************************ - */ -M4OSA_ERR M4READER_PCM_destroy(M4OSA_Context context) -{ - M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; - - /* Check function parameters */ - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "M4READER_PCM_destroy: invalid context pointer"); - - free(pC); - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * @brief Initializes the reader instance - * @param context: (IN) context of the network reader - * @param pFileDescriptor: (IN) Pointer to proprietary data identifying the media to open - * @return M4NO_ERROR: there is no error - * @return M4ERR_PARAMETER: at least one parameter is not properly set (in DEBUG only) - ************************************************************************ - */ -M4OSA_ERR M4READER_PCM_open(M4OSA_Context context, M4OSA_Void* pFileDescriptor) -{ - M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; - M4OSA_ERR err; - - /* Check function parameters */ - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "M4READER_PCM_open: invalid context pointer"); - M4OSA_DEBUG_IF1((M4OSA_NULL == pFileDescriptor), M4ERR_PARAMETER, - "M4READER_PCM_open: invalid pointer pFileDescriptor"); - - err = M4PCMR_openRead(&(pC->m_coreContext), (M4OSA_Char*)pFileDescriptor, - pC->m_pOsaFileReaderFcts); - - return err; -} - -/** - ************************************************************************ - * @brief close the reader - * @note - * @param context: (IN) Context of the reader - * @return M4NO_ERROR there is no error - * @return M4ERR_PARAMETER the context is NULL - * @return M4ERR_BAD_CONTEXT provided context is not a valid one - ************************************************************************ - */ -M4OSA_ERR M4READER_PCM_close(M4OSA_Context context) -{ - M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; - M4OSA_ERR err; - - /* Check function parameters */ - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "M4READER_PCM_close: invalid context pointer"); - - /* Free audio AU and audio stream */ - if (M4OSA_NULL != pC->m_pAudioStream) - { - if (M4OSA_NULL != pC->m_audioAu.dataAddress) - { - err = M4PCMR_freeAU(pC->m_coreContext, pC->m_pAudioStream->m_streamId, - &pC->m_audioAu); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_0("M4READER_PCM_close: Error when freeing audio access unit"); - return err; - } - } - free(pC->m_pAudioStream); - pC->m_pAudioStream = M4OSA_NULL; - } - - - if (M4OSA_NULL != pC->m_coreContext) - { - /* Close tha PCM file */ - err = M4PCMR_closeRead(pC->m_coreContext); - pC->m_coreContext = M4OSA_NULL; - } - - - return err; -} - -/** - ************************************************************************ - * @brief set en option value of the reader - * @note this function follows the set/get option mechanism described in OSAL 3.0 - * it allows the caller to set a property value: - * @param context: (IN) Context of the reader - * @param optionId: (IN) indicates the option to set - * @param pValue: (IN) pointer to structure or value (allocated by user) - * where option is stored - * - * @return M4NO_ERROR there is no error - * @return M4ERR_BAD_CONTEXT provided context is not a valid one - * @return M4ERR_PARAMETER at least one parameter is not properly set - * @return M4ERR_BAD_OPTION_ID when the option ID is not a valid one - ************************************************************************ - */ -M4OSA_ERR M4READER_PCM_setOption(M4OSA_Context context, M4OSA_OptionID optionId, void* pValue) -{ - M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; - M4OSA_ERR err = M4NO_ERROR; - - /* Check function parameters */ - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "M4READER_PCM_setOption: invalid context pointer"); - M4OSA_DEBUG_IF1((M4OSA_NULL == pValue), M4ERR_PARAMETER, - "M4READER_PCM_setOption: invalid value pointer"); - - switch(optionId) - { - case M4READER_kOptionID_SetOsaFileReaderFctsPtr : - { - pC->m_pOsaFileReaderFcts = (M4OSA_FileReadPointer*)pValue; - } - break; - default : - { - err = M4ERR_PARAMETER; - } - } - - return err; -} - -/** - ************************************************************************ - * @brief Retrieves the an option value from the reader, given an option ID. - * @note this function follows the set/get option mechanism described in OSAL 3.0 - * it allows the caller to retrieve a property value: - * - * @param context: (IN) context of the network reader - * @param optionId: (IN) option identificator whose option value is to be retrieved. - * @param pValue: (OUT) option value retrieved. - * - * @return M4NO_ERROR: there is no error - * @return M4ERR_PARAMETER: at least one parameter is not properly set (in DEBUG only) - * @return M4ERR_BAD_OPTION_ID: the required option identificator is unknown - ************************************************************************ - */ -M4OSA_ERR M4READER_PCM_getOption(M4OSA_Context context, M4OSA_OptionID optionId, void* pValue) -{ - M4READER_PCM_Context* pContext = (M4READER_PCM_Context*)context; - M4OSA_ERR err = M4NO_ERROR; - - /* no check of context at this level because some option does not need it */ - M4OSA_DEBUG_IF1((pValue == 0), M4ERR_PARAMETER, - "M4READER_PCM_getOption: invalid pointer on value"); - - switch (optionId) - { - case M4READER_kOptionID_Duration: - *((M4OSA_UInt32*)pValue) = pContext->m_pAudioStream->m_duration; - break; - - case M4READER_kOptionID_Version: - err = M4PCMR_getVersion((M4_VersionInfo*)pValue); - break; - - case M4READER_kOptionID_Copyright: - return M4ERR_NOT_IMPLEMENTED; - break; - - case M4READER_kOptionID_Bitrate: - { - M4OSA_UInt32* pBitrate = (M4OSA_UInt32*)pValue; - if (M4OSA_NULL != pContext->m_pAudioStream) - { - *pBitrate = pContext->m_pAudioStream->m_averageBitRate; - } - else - { - pBitrate = 0; - err = M4ERR_PARAMETER; - } - } - break; - - default: - err = M4ERR_BAD_OPTION_ID; - M4OSA_TRACE1_0("M4READER_PCM_getOption: unsupported optionId"); - break; - } - - return err; -} - -/** - ************************************************************************ - * @brief Get the next stream found in the media - * @note - * - * @param context: (IN) context of the network reader - * @param pMediaFamily: (OUT) pointer to a user allocated M4READER_MediaFamily that will - * be filled - * @param pStreamHandler: (OUT) pointer to a stream handler that will be allocated and filled - * with the found stream description - * - * @return M4NO_ERROR: there is no error. - * @return M4ERR_PARAMETER: at least one parameter is not properly set (in DEBUG only) - * @return M4WAR_NO_MORE_STREAM no more available stream in the media (all streams found) - ************************************************************************ - */ -M4OSA_ERR M4READER_PCM_getNextStream(M4OSA_Context context, M4READER_MediaFamily *pMediaFamily, - M4_StreamHandler **pStreamHandler) -{ - M4READER_PCM_Context* pC=(M4READER_PCM_Context*)context; - M4OSA_ERR err; -/* M4_StreamHandler* pStreamHandler = M4OSA_NULL;*/ - M4SYS_StreamDescription streamDesc; - M4_AudioStreamHandler* pAudioStreamHandler; - M4OSA_Double fDuration; - M4SYS_StreamID streamIdArray[2]; - M4PCMC_DecoderSpecificInfo* pDsi; - - M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, - "M4READER_PCM_getNextStream: invalid context"); - M4OSA_DEBUG_IF1((pMediaFamily == 0), M4ERR_PARAMETER, - "M4READER_PCM_getNextStream: invalid pointer to MediaFamily"); - M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, - "M4READER_PCM_getNextStream: invalid pointer to StreamHandler"); - - err = M4PCMR_getNextStream( pC->m_coreContext, &streamDesc); - if (err == M4WAR_NO_MORE_STREAM) - { - streamIdArray[0] = 0; - streamIdArray[1] = 0; - err = M4PCMR_startReading(pC->m_coreContext, streamIdArray); /*to put in open function*/ - - return M4WAR_NO_MORE_STREAM; - } - else if (M4NO_ERROR != err) - { - return err; /*also return M4WAR_NO_MORE_STREAM*/ - } - - switch (streamDesc.streamType) - { - case M4SYS_kAudioUnknown: - case M4SYS_kPCM_16bitsS: - case M4SYS_kPCM_16bitsU: - case M4SYS_kPCM_8bitsU: - *pMediaFamily = M4READER_kMediaFamilyAudio; - M4OSA_TRACE2_0("M4READER_PCM_getNextStream: found audio stream"); - break; - default: - *pMediaFamily = M4READER_kMediaFamilyUnknown; - M4OSA_TRACE2_0("M4READER_PCM_getNextStream: found UNKNOWN stream"); - return M4NO_ERROR; - } - - pAudioStreamHandler = (M4_AudioStreamHandler*)M4OSA_32bitAlignedMalloc(sizeof(M4_AudioStreamHandler), - M4READER_WAV, (M4OSA_Char *)"M4_AudioStreamHandler"); - if (pAudioStreamHandler == M4OSA_NULL) - { - return M4ERR_ALLOC; - } - pAudioStreamHandler->m_structSize = sizeof(M4_AudioStreamHandler); - pC->m_pAudioStream = (M4_StreamHandler*)(pAudioStreamHandler); - - pDsi = (M4PCMC_DecoderSpecificInfo*)(streamDesc.decoderSpecificInfo); - M4OSA_DEBUG_IF1((pDsi == 0), M4ERR_PARAMETER, - "M4READER_PCM_getNextStream: invalid decoder specific info in stream"); - - pAudioStreamHandler->m_samplingFrequency = pDsi->SampleFrequency; - pAudioStreamHandler->m_byteSampleSize = (M4OSA_UInt32)(pDsi->BitsPerSample/8); - /* m_byteFrameLength is badly named: it is not in bytes but in samples number */ - if(pAudioStreamHandler->m_samplingFrequency == 8000) - { - /* AMR case */ - pAudioStreamHandler->m_byteFrameLength = - (((streamDesc.averageBitrate/8)/50)/pDsi->nbChannels)\ - /pAudioStreamHandler->m_byteSampleSize;/*/50 to get around 20 ms of audio*/ - } - else - { - /* AAC Case */ - pAudioStreamHandler->m_byteFrameLength = - (M4OSA_UInt32)(((streamDesc.averageBitrate/8)/15.625)/pDsi->nbChannels)\ - /pAudioStreamHandler->m_byteSampleSize; - } - - pAudioStreamHandler->m_nbChannels = pDsi->nbChannels; - - M4OSA_TIME_TO_MS( fDuration, streamDesc.duration, streamDesc.timeScale); - pC->m_pAudioStream->m_duration = (M4OSA_Int32)fDuration; - pC->m_pAudioStream->m_pDecoderSpecificInfo = (M4OSA_UInt8*)(streamDesc.decoderSpecificInfo); - pC->m_pAudioStream->m_decoderSpecificInfoSize = streamDesc.decoderSpecificInfoSize; - pC->m_pAudioStream->m_streamId = streamDesc.streamID; - pC->m_pAudioStream->m_pUserData = - (void*)(intptr_t)streamDesc.timeScale; /*trick to change*/ - pC->m_pAudioStream->m_averageBitRate = streamDesc.averageBitrate; - pC->m_pAudioStream->m_maxAUSize = - pAudioStreamHandler->m_byteFrameLength*pAudioStreamHandler->m_byteSampleSize\ - *pAudioStreamHandler->m_nbChannels; - pC->m_pAudioStream->m_streamType = M4DA_StreamTypeAudioPcm; - - *pStreamHandler = pC->m_pAudioStream; - return err; -} - -/** - ************************************************************************ - * @brief fill the access unit structure with initialization values - * @note - * - * @param context: (IN) context of the network reader - * @param pStreamHandler: (IN) pointer to the stream handler to which the access unit will - * be associated - * @param pAccessUnit: (IN) pointer to the access unit(allocated by the caller) to initialize - * @return M4NO_ERROR: there is no error. - * @return M4ERR_PARAMETER: at least one parameter is not properly set (in DEBUG only) - ************************************************************************ - */ -M4OSA_ERR M4READER_PCM_fillAuStruct(M4OSA_Context context, M4_StreamHandler *pStreamHandler, - M4_AccessUnit *pAccessUnit) -{ - M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; - M4SYS_AccessUnit* pAu; - - M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, - "M4READER_PCM_fillAuStruct: invalid context"); - M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, - "M4READER_PCM_fillAuStruct: invalid pointer to M4_StreamHandler"); - M4OSA_DEBUG_IF1((pAccessUnit == 0), M4ERR_PARAMETER, - "M4READER_PCM_fillAuStruct: invalid pointer to M4_AccessUnit"); - - if (pStreamHandler == (M4_StreamHandler*)pC->m_pAudioStream) - { - pAu = &pC->m_audioAu; - } - else - { - M4OSA_TRACE1_0("M4READER_PCM_fillAuStruct: passed StreamHandler is not known"); - return M4ERR_PARAMETER; - } - - pAu->dataAddress = M4OSA_NULL; - pAu->size = 0; - pAu->CTS = 0; - pAu->DTS = 0; - pAu->attribute = 0; - pAu->nbFrag = 0; - - pAccessUnit->m_size = 0; - pAccessUnit->m_CTS = 0; - pAccessUnit->m_DTS = 0; - pAccessUnit->m_attribute = 0; - pAccessUnit->m_dataAddress = M4OSA_NULL;/*pBuffer;*/ - pAccessUnit->m_maxsize = pStreamHandler->m_maxAUSize; - pAccessUnit->m_streamID = pStreamHandler->m_streamId; - pAccessUnit->m_structSize = sizeof(M4_AccessUnit); - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * @brief reset the stream, that is: seek it to beginning and make it ready to be read - * @note - * @param context: (IN) context of the network reader - * @param pStreamHandler: (IN) The stream handler of the stream to reset - * @return M4NO_ERROR: there is no error. - ************************************************************************ - */ -M4OSA_ERR M4READER_PCM_reset(M4OSA_Context context, M4_StreamHandler *pStreamHandler) -{ - M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; - M4SYS_StreamID streamIdArray[2]; - M4OSA_ERR err; - M4SYS_AccessUnit* pAu; - M4OSA_Time time64 = 0; - - M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, "M4READER_PCM_reset: invalid context"); - M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, - "M4READER_PCM_reset: invalid pointer to M4_StreamHandler"); - - if (pStreamHandler == (M4_StreamHandler*)pC->m_pAudioStream) - { - pAu = &pC->m_audioAu; - } - else - { - M4OSA_TRACE1_0("M4READER_PCM_reset: passed StreamHandler is not known"); - return M4ERR_PARAMETER; - } - - if (pAu->dataAddress != M4OSA_NULL) - { - err = M4PCMR_freeAU(pC->m_coreContext, pStreamHandler->m_streamId, pAu); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_0("M4READER_PCM_reset: error when freeing access unit"); - return err; - } - pAu->dataAddress = M4OSA_NULL; - } - - streamIdArray[0] = pStreamHandler->m_streamId; - streamIdArray[1] = 0; - - pAu->CTS = 0; - pAu->DTS = 0; - - /* This call is needed only when replay during playback */ - err = M4PCMR_seek(pC->m_coreContext, streamIdArray, time64, M4SYS_kBeginning, &time64); - - return err; -} - -/** - ************************************************************************ - * @brief Get the next access unit of the specified stream - * @note - * @param context: (IN) Context of the reader - * @param pStreamHandler (IN) The stream handler of the stream to make jump - * @param pAccessUnit (IN/OUT) Pointer to an access unit to fill with read data - * (the au structure is allocated by the user, and must be - * initialized - * by calling M4READER_fillAuStruct_fct after creation) - * @return M4NO_ERROR there is no error - * @return M4ERR_BAD_CONTEXT provided context is not a valid one - * @return M4ERR_PARAMETER at least one parameter is not properly set - * @returns M4ERR_ALLOC memory allocation failed - * @returns M4ERR_BAD_STREAM_ID at least one of the stream Id. does not exist. - * @returns M4WAR_NO_DATA_YET there is no enough data on the stream for new access unit - * @returns M4WAR_NO_MORE_AU there are no more access unit in the stream (end of stream) - ************************************************************************ - */ -M4OSA_ERR M4READER_PCM_getNextAu(M4OSA_Context context, M4_StreamHandler *pStreamHandler, - M4_AccessUnit *pAccessUnit) -{ - M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; - M4OSA_ERR err = M4NO_ERROR; - M4SYS_AccessUnit* pAu; - - M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, - "M4READER_PCM_getNextAu: invalid context"); - M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, - "M4READER_PCM_getNextAu: invalid pointer to M4_StreamHandler"); - M4OSA_DEBUG_IF1((pAccessUnit == 0), M4ERR_PARAMETER, - "M4READER_PCM_getNextAu: invalid pointer to M4_AccessUnit"); - - /* keep trace of the allocated buffers in AU to be able to free them at destroy() - but be aware that system is risky and would need upgrade if more than - one video and one audio AU is needed */ - if (pStreamHandler == (M4_StreamHandler*)pC->m_pAudioStream) - { - pAu = &pC->m_audioAu; - } - else - { - M4OSA_TRACE1_0("M4READER_PCM_getNextAu: passed StreamHandler is not known"); - return M4ERR_PARAMETER; - } - - if (pAu->dataAddress != M4OSA_NULL) - { - err = M4PCMR_freeAU(pC->m_coreContext, pStreamHandler->m_streamId, pAu); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_0("M4READER_PCM_getNextAu: error when freeing access unit"); - return err; - } - } - - pAu->nbFrag = 0; - err = M4PCMR_nextAU(pC->m_coreContext, pStreamHandler->m_streamId, pAu); - - if (err == M4NO_ERROR) - { - pAccessUnit->m_dataAddress = (M4OSA_MemAddr8)pAu->dataAddress; - pAccessUnit->m_size = pAu->size; - pAccessUnit->m_CTS = (M4OSA_Double)pAu->CTS; - pAccessUnit->m_DTS = (M4OSA_Double)pAu->DTS; - pAccessUnit->m_attribute = pAu->attribute; - } - else - { - pAccessUnit->m_size=0; - } - - return err; -} - - -/** - ************************************************************************ - * @brief jump into the stream at the specified time - * @note - * @param context: (IN) Context of the reader - * @param pStreamHandler (IN) the stream handler of the stream to make jump - * @param pTime (IN/OUT) IN: the time to jump to (in ms) - * OUT: the time to which the stream really jumped - * But in this reader, we do not modify the time - * @return M4NO_ERROR there is no error - * @return M4ERR_BAD_CONTEXT provided context is not a valid one - * @return M4ERR_PARAMETER at least one parameter is not properly set - * @return M4ERR_ALLOC there is no more memory available - * @return M4ERR_BAD_STREAM_ID the streamID does not exist - ************************************************************************ - */ -M4OSA_ERR M4READER_PCM_jump(M4OSA_Context context, M4_StreamHandler *pStreamHandler, - M4OSA_Int32* pTime) -{ - M4READER_PCM_Context* pC = (M4READER_PCM_Context*)context; - M4SYS_StreamID streamIdArray[2]; - M4OSA_ERR err; - M4SYS_AccessUnit* pAu; - M4OSA_Time time64; - - M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, "M4READER_PCM_jump: invalid context"); - M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, - "M4READER_PCM_jump: invalid pointer to M4_StreamHandler"); - M4OSA_DEBUG_IF1((pTime == 0), M4ERR_PARAMETER, "M4READER_PCM_jump: invalid time pointer"); - - time64 = (M4OSA_Time)*pTime; - - if (pStreamHandler == pC->m_pAudioStream) - { - pAu = &pC->m_audioAu; - } - else - { - M4OSA_TRACE1_0("M4READER_PCM_jump: passed StreamHandler is not known"); - return M4ERR_PARAMETER; - } - - if (pAu->dataAddress != M4OSA_NULL) - { - err = M4PCMR_freeAU(pC->m_coreContext, pStreamHandler->m_streamId, pAu); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_0("M4READER_PCM_jump: Error when freeing access unit"); - return err; - } - pAu->dataAddress = M4OSA_NULL; - } - - streamIdArray[0] = pStreamHandler->m_streamId; - streamIdArray[1] = 0; - - pAu->CTS = time64; - pAu->DTS = time64; - - err = M4PCMR_seek(pC->m_coreContext, streamIdArray, time64, M4SYS_kBeginning, &time64); - - *pTime = (M4OSA_Int32)time64; - - return err; -} - -/** - ************************************************************************* - * @brief Retrieves the generic interfaces implemented by the reader - * - * @param pMediaType : Pointer on a M4READER_MediaType (allocated by the caller) - * that will be filled with the media type supported by this reader - * @param pRdrGlobalInterface : Address of a pointer that will be set to the global interface - * implemented by this reader. The interface is a structure allocated - * by the function and must be un-allocated by the caller. - * @param pRdrDataInterface : Address of a pointer that will be set to the data interface - * implemented by this reader. The interface is a structure allocated - * by the function and must be un-allocated by the caller. - * - * @returns : M4NO_ERROR if OK - * ERR_ALLOC if an allocation failed - * ERR_PARAMETER at least one parameter is not properly set (in DEBUG only) - ************************************************************************* - */ -M4OSA_ERR M4READER_PCM_getInterfaces(M4READER_MediaType *pMediaType, - M4READER_GlobalInterface **pRdrGlobalInterface, - M4READER_DataInterface **pRdrDataInterface) -/************************************************************************/ -{ - M4OSA_DEBUG_IF1((pMediaType == 0), M4ERR_PARAMETER, - "M4READER_PCM_getInterfaces: invalid pointer to MediaType passed"); - M4OSA_DEBUG_IF1((pRdrGlobalInterface == 0), M4ERR_PARAMETER, - "M4READER_PCM_getInterfaces: invalid pointer to M4READER_GlobalInterface"); - M4OSA_DEBUG_IF1((pRdrDataInterface == 0), M4ERR_PARAMETER, - "M4READER_PCM_getInterfaces: invalid pointer to M4READER_DataInterface"); - - *pRdrGlobalInterface = - (M4READER_GlobalInterface*)M4OSA_32bitAlignedMalloc( sizeof(M4READER_GlobalInterface), M4READER_WAV, - (M4OSA_Char *)"M4READER_PCM GlobalInterface"); - if (M4OSA_NULL == *pRdrGlobalInterface) - { - return M4ERR_ALLOC; - } - *pRdrDataInterface = - (M4READER_DataInterface*)M4OSA_32bitAlignedMalloc( sizeof(M4READER_DataInterface), M4READER_WAV, - (M4OSA_Char *) "M4READER_PCM DataInterface"); - if (M4OSA_NULL == *pRdrDataInterface) - { - free(*pRdrGlobalInterface); - return M4ERR_ALLOC; - } - - *pMediaType = M4READER_kMediaTypePCM; - - (*pRdrGlobalInterface)->m_pFctCreate = M4READER_PCM_create; - (*pRdrGlobalInterface)->m_pFctDestroy = M4READER_PCM_destroy; - (*pRdrGlobalInterface)->m_pFctOpen = M4READER_PCM_open; - (*pRdrGlobalInterface)->m_pFctClose = M4READER_PCM_close; - (*pRdrGlobalInterface)->m_pFctStart = M4OSA_NULL; - (*pRdrGlobalInterface)->m_pFctStop = M4OSA_NULL; - (*pRdrGlobalInterface)->m_pFctGetOption = M4READER_PCM_getOption; - (*pRdrGlobalInterface)->m_pFctSetOption = M4READER_PCM_setOption; - (*pRdrGlobalInterface)->m_pFctGetNextStream = M4READER_PCM_getNextStream; - (*pRdrGlobalInterface)->m_pFctFillAuStruct = M4READER_PCM_fillAuStruct; - (*pRdrGlobalInterface)->m_pFctJump = M4READER_PCM_jump; - (*pRdrGlobalInterface)->m_pFctReset = M4READER_PCM_reset; - (*pRdrGlobalInterface)->m_pFctGetPrevRapTime = M4OSA_NULL; /*all AUs are RAP*/ - - (*pRdrDataInterface)->m_pFctGetNextAu = M4READER_PCM_getNextAu; - - (*pRdrDataInterface)->m_readerContext = M4OSA_NULL; - - return M4NO_ERROR; -} - - |