diff options
Diffstat (limited to 'libvideoeditor/vss/src')
27 files changed, 0 insertions, 37881 deletions
diff --git a/libvideoeditor/vss/src/Android.mk b/libvideoeditor/vss/src/Android.mk deleted file mode 100755 index 0a3d64e..0000000 --- a/libvideoeditor/vss/src/Android.mk +++ /dev/null @@ -1,94 +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. -# - -LOCAL_PATH:= $(call my-dir) - -# -# libvss -# -include $(CLEAR_VARS) - -LOCAL_MODULE:= libvideoeditor_core - -LOCAL_SRC_FILES:= \ - M4PTO3GPP_API.c \ - M4PTO3GPP_VideoPreProcessing.c \ - M4VIFI_xVSS_RGB565toYUV420.c \ - M4xVSS_API.c \ - M4xVSS_internal.c \ - M4VSS3GPP_AudioMixing.c \ - M4VSS3GPP_Clip.c \ - M4VSS3GPP_ClipAnalysis.c \ - M4VSS3GPP_Codecs.c \ - M4VSS3GPP_Edit.c \ - M4VSS3GPP_EditAudio.c \ - M4VSS3GPP_EditVideo.c \ - M4VSS3GPP_MediaAndCodecSubscription.c \ - M4ChannelConverter.c \ - M4VD_EXTERNAL_BitstreamParser.c \ - M4AIR_API.c \ - M4READER_Pcm.c \ - M4PCMR_CoreReader.c \ - M4AD_Null.c \ - M4AMRR_CoreReader.c \ - M4READER_Amr.c \ - M4VD_Tools.c \ - VideoEditorResampler.cpp \ - M4DECODER_Null.c - - -LOCAL_MODULE_TAGS := optional - -LOCAL_SHARED_LIBRARIES := \ - libaudioresampler \ - libaudioutils \ - libbinder \ - libcutils \ - liblog \ - libmedia \ - libstagefright \ - libstagefright_foundation \ - libstagefright_omx \ - libutils \ - libvideoeditor_osal \ - libvideoeditor_videofilters \ - libvideoeditorplayer \ - -LOCAL_STATIC_LIBRARIES := \ - libstagefright_color_conversion \ - libvideoeditor_mcs \ - libvideoeditor_stagefrightshells \ - libvideoeditor_3gpwriter \ - -LOCAL_C_INCLUDES += \ - $(TOP)/frameworks/av/libvideoeditor/osal/inc \ - $(TOP)/frameworks/av/libvideoeditor/vss/inc \ - $(TOP)/frameworks/av/libvideoeditor/vss/mcs/inc \ - $(TOP)/frameworks/av/libvideoeditor/vss/common/inc \ - $(TOP)/frameworks/av/libvideoeditor/vss/stagefrightshells/inc \ - $(TOP)/frameworks/av/services/audioflinger \ - $(TOP)/frameworks/native/include/media/openmax \ - $(TOP)/system/media/audio_effects/include \ - $(TOP)/system/media/audio_utils/include - - -LOCAL_SHARED_LIBRARIES += libdl - -LOCAL_CFLAGS += -Wno-multichar \ - -DM4xVSS_RESERVED_MOOV_DISK_SPACEno \ - -DDECODE_GIF_ON_SAVING - -include $(BUILD_SHARED_LIBRARY) diff --git a/libvideoeditor/vss/src/M4AD_Null.c b/libvideoeditor/vss/src/M4AD_Null.c deleted file mode 100755 index cd1ec73..0000000 --- a/libvideoeditor/vss/src/M4AD_Null.c +++ /dev/null @@ -1,256 +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 M4AD_Null.c - * @brief Implementation of the MP3 decoder public interface - * @note This file implements a "null" audio decoder, that is a decoder - * that do nothing except getting AU from the reader -************************************************************************* -*/ -#include "M4OSA_Debug.h" -#include "M4OSA_Error.h" -#include "M4OSA_Debug.h" -#include "M4TOOL_VersionInfo.h" -#include "M4AD_Common.h" -#include "M4AD_Null.h" - -#define M4AD_FORCE_16BITS - -/** - ************************************************************************ - * NULL Audio Decoder version information - ************************************************************************ -*/ -/* CHANGE_VERSION_HERE */ -#define M4AD_NULL_MAJOR 1 -#define M4AD_NULL_MINOR 1 -#define M4AD_NULL_REVISION 4 - -/** - ************************************************************************ - * structure M4AD_NullContext - * @brief Internal null decoder context - ************************************************************************ -*/ -typedef struct -{ - /**< Pointer to the stream handler provided by the user */ - M4_AudioStreamHandler* m_pAudioStreamhandler; -} M4AD_NullContext; - - -/** - ************************************************************************ - * NXP MP3 decoder functions definition - ************************************************************************ -*/ - -/** - ************************************************************************ - * @brief Creates an instance of the null decoder - * @note Allocates the context - * - * @param pContext: (OUT) Context of the decoder - * @param pStreamHandler: (IN) Pointer to an audio stream description - * @param pUserData: (IN) Pointer to User data - * - * @return M4NO_ERROR there is no error - * @return M4ERR_STATE State automaton is not applied - * @return M4ERR_ALLOC a memory allocation has failed - * @return M4ERR_PARAMETER at least one parameter is not properly set (in DEBUG only) - ************************************************************************ -*/ -M4OSA_ERR M4AD_NULL_create( M4AD_Context* pContext, - M4_AudioStreamHandler *pStreamHandler, - void* pUserData) -{ - M4AD_NullContext* pC; - - M4OSA_DEBUG_IF1((pContext == 0), M4ERR_PARAMETER, - "M4AD_NULL_create: invalid context pointer"); - M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, - "M4AD_NULL_create: invalid pointer pStreamHandler"); - - pC = (M4AD_NullContext*)M4OSA_32bitAlignedMalloc(sizeof(M4AD_NullContext), - M4DECODER_AUDIO, (M4OSA_Char *)"M4AD_NullContext"); - if (pC == (M4AD_NullContext*)0) - { - M4OSA_TRACE1_0("Can not allocate null decoder context"); - return M4ERR_ALLOC; - } - - *pContext = pC; - - pC->m_pAudioStreamhandler = pStreamHandler; - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * @brief Destroys the instance of the null decoder - * @note After this call the context is invalid - * - * @param context: (IN) Context of the decoder - * - * @return M4NO_ERROR There is no error - * @return M4ERR_PARAMETER The context is invalid (in DEBUG only) - ************************************************************************ -*/ -M4OSA_ERR M4AD_NULL_destroy(M4AD_Context context) -{ - M4AD_NullContext* pC = (M4AD_NullContext*)context; - - M4OSA_DEBUG_IF1((context == M4OSA_NULL), M4ERR_PARAMETER, "M4AD_NULL_destroy: invalid context"); - - free(pC); - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * @brief Simply output the given audio data - * @note - * - * @param context: (IN) Context of the decoder - * @param pInputBuffer: (IN/OUT)Input Data buffer. It contains at least one audio frame. - * The size of the buffer must be updated inside the function - * to reflect the size of the actually decoded data. - * (e.g. the first frame in pInputBuffer) - * @param pDecodedPCMBuffer: (OUT) Output PCM buffer (decoded data). - * @param jumping: (IN) M4OSA_TRUE if a jump was just done, M4OSA_FALSE otherwise. - * @return M4NO_ERROR there is no error - * @return M4ERR_PARAMETER at least one parameter is not properly set - ************************************************************************ -*/ -M4OSA_ERR M4AD_NULL_step(M4AD_Context context, M4AD_Buffer *pInputBuffer, - M4AD_Buffer *pDecodedPCMBuffer, M4OSA_Bool jumping) -{ - M4AD_NullContext* pC = (M4AD_NullContext*)context; - - /*The VPS sends a zero buffer at the end*/ - if (0 == pInputBuffer->m_bufferSize) - { - return M4WAR_NO_MORE_AU; - } - - if (pInputBuffer->m_bufferSize > pDecodedPCMBuffer->m_bufferSize) - { - return M4ERR_PARAMETER; - } -#ifdef M4AD_FORCE_16BITS - /*if read samples are 8 bits, complete them to 16 bits*/ - if (pC->m_pAudioStreamhandler->m_byteSampleSize == 1) - { - M4OSA_UInt32 i; - M4OSA_Int16 val; - - for (i = 0; i < pInputBuffer->m_bufferSize; i++) - { - val = (M4OSA_Int16)((M4OSA_UInt8)(pInputBuffer->m_dataAddress[i]) - 128); - - pDecodedPCMBuffer->m_dataAddress[i*2] = (M4OSA_Int8)(val>>8); - pDecodedPCMBuffer->m_dataAddress[i*2+1] = (M4OSA_Int8)(val&0x00ff); - } - } - else - { - memcpy((void *)pDecodedPCMBuffer->m_dataAddress, (void *)pInputBuffer->m_dataAddress, - pInputBuffer->m_bufferSize ); - } -#else /*M4AD_FORCE_16BITS*/ - memcpy((void *)pDecodedPCMBuffer->m_dataAddress, (void *)pInputBuffer->m_dataAddress, - pInputBuffer->m_bufferSize ); -#endif /*M4AD_FORCE_16BITS*/ - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * @brief Gets the decoder version - * @note The version is given in a M4_VersionInfo structure - * - * @param pValue: (OUT) Pointer to the version structure - * - * @return M4NO_ERROR there is no error - * @return M4ERR_PARAMETER pVersionInfo pointer is null (in DEBUG only) - ************************************************************************ -*/ -M4OSA_ERR M4AD_NULL_getVersion(M4_VersionInfo* pVersionInfo) -{ - M4OSA_ERR err = M4NO_ERROR; - M4OSA_DEBUG_IF1((pVersionInfo == 0), M4ERR_PARAMETER, - "M4AD_NULL_getVersion: invalid pointer pVersionInfo"); - - /* Up until now, the null decoder version is not available */ - - /* CHANGE_VERSION_HERE */ - pVersionInfo->m_major = M4AD_NULL_MAJOR; /*major version of the component*/ - pVersionInfo->m_minor = M4AD_NULL_MINOR; /*minor version of the component*/ - pVersionInfo->m_revision = M4AD_NULL_REVISION; /*revision version of the component*/ - pVersionInfo->m_structSize=sizeof(M4_VersionInfo); - - return err; -} - - -/** - ************************************************************************ - * getInterface function definitions of NXP MP3 decoder - ************************************************************************ -*/ - -/** - ************************************************************************ - * @brief Retrieves the interface implemented by the decoder - * @param pDecoderType : pointer on an M4AD_Type (allocated by the caller) - * that will be filled with the decoder type supported by - * this decoder - * @param pDecoderInterface : address of a pointer that will be set to the interface - * implemented by this decoder. The interface is a structure - * allocated by the function and must be un-allocated by the - * caller. - * - * @return M4NO_ERROR if OK - * @return M4ERR_ALLOC if allocation failed - ************************************************************************ -*/ -M4OSA_ERR M4AD_NULL_getInterface( M4AD_Type *pDecoderType, M4AD_Interface **pDecoderInterface) -{ - *pDecoderInterface = ( M4AD_Interface*)M4OSA_32bitAlignedMalloc( sizeof(M4AD_Interface), - M4DECODER_AUDIO, (M4OSA_Char *)"M4AD_Interface" ); - if (M4OSA_NULL == *pDecoderInterface) - { - return M4ERR_ALLOC; - } - - *pDecoderType = M4AD_kTypePCM; - - (*pDecoderInterface)->m_pFctCreateAudioDec = M4AD_NULL_create; - (*pDecoderInterface)->m_pFctDestroyAudioDec = M4AD_NULL_destroy; - (*pDecoderInterface)->m_pFctStepAudioDec = M4AD_NULL_step; - (*pDecoderInterface)->m_pFctGetVersionAudioDec = M4AD_NULL_getVersion; - (*pDecoderInterface)->m_pFctStartAudioDec = M4OSA_NULL; - (*pDecoderInterface)->m_pFctResetAudioDec = M4OSA_NULL; - (*pDecoderInterface)->m_pFctSetOptionAudioDec = M4OSA_NULL; - (*pDecoderInterface)->m_pFctGetOptionAudioDec = M4OSA_NULL; - - return M4NO_ERROR; -} - diff --git a/libvideoeditor/vss/src/M4AIR_API.c b/libvideoeditor/vss/src/M4AIR_API.c deleted file mode 100755 index 62897b0..0000000 --- a/libvideoeditor/vss/src/M4AIR_API.c +++ /dev/null @@ -1,968 +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 M4AIR_API.c - * @brief Area of Interest Resizer API - ************************************************************************* - */ - -#define M4AIR_YUV420_FORMAT_SUPPORTED -#define M4AIR_YUV420A_FORMAT_SUPPORTED - -/************************* COMPILATION CHECKS ***************************/ -#ifndef M4AIR_YUV420_FORMAT_SUPPORTED -#ifndef M4AIR_BGR565_FORMAT_SUPPORTED -#ifndef M4AIR_RGB565_FORMAT_SUPPORTED -#ifndef M4AIR_BGR888_FORMAT_SUPPORTED -#ifndef M4AIR_RGB888_FORMAT_SUPPORTED -#ifndef M4AIR_JPG_FORMAT_SUPPORTED - -#error "Please define at least one input format for the AIR component" - -#endif -#endif -#endif -#endif -#endif -#endif - -/******************************* INCLUDES *******************************/ -#include "M4OSA_Types.h" -#include "M4OSA_Error.h" -#include "M4OSA_CoreID.h" -#include "M4OSA_Mutex.h" -#include "M4OSA_Memory.h" -#include "M4VIFI_FiltersAPI.h" -#include "M4AIR_API.h" - -/************************ M4AIR INTERNAL TYPES DEFINITIONS ***********************/ - -/** - ****************************************************************************** - * enum M4AIR_States - * @brief The following enumeration defines the internal states of the AIR. - ****************************************************************************** - */ -typedef enum -{ - M4AIR_kCreated, /**< State after M4AIR_create has been called */ - M4AIR_kConfigured /**< State after M4AIR_configure has been called */ -}M4AIR_States; - - -/** - ****************************************************************************** - * struct M4AIR_InternalContext - * @brief The following structure is the internal context of the AIR. - ****************************************************************************** - */ -typedef struct -{ - M4AIR_States m_state; /**< Internal state */ - M4AIR_InputFormatType m_inputFormat; /**< Input format like YUV420Planar, - RGB565, JPG, etc ... */ - M4AIR_Params m_params; /**< Current input Parameter of the processing */ - M4OSA_UInt32 u32_x_inc[4]; /**< ratio between input and ouput width for YUV */ - M4OSA_UInt32 u32_y_inc[4]; /**< ratio between input and ouput height for YUV */ - M4OSA_UInt32 u32_x_accum_start[4]; /**< horizontal initial accumulator value */ - M4OSA_UInt32 u32_y_accum_start[4]; /**< Vertical initial accumulator value */ - M4OSA_UInt32 u32_x_accum[4]; /**< save of horizontal accumulator value */ - M4OSA_UInt32 u32_y_accum[4]; /**< save of vertical accumulator value */ - M4OSA_UInt8* pu8_data_in[4]; /**< Save of input plane pointers - in case of stripe mode */ - M4OSA_UInt32 m_procRows; /**< Number of processed rows, - used in stripe mode only */ - M4OSA_Bool m_bOnlyCopy; /**< Flag to know if we just perform a copy - or a bilinear interpolation */ - M4OSA_Bool m_bFlipX; /**< Depend on output orientation, used during - processing to revert processing order in X - coordinates */ - M4OSA_Bool m_bFlipY; /**< Depend on output orientation, used during - processing to revert processing order in Y - coordinates */ - M4OSA_Bool m_bRevertXY; /**< Depend on output orientation, used during - processing to revert X and Y processing order - (+-90° rotation) */ -}M4AIR_InternalContext; - -/********************************* MACROS *******************************/ -#define M4ERR_CHECK_NULL_RETURN_VALUE(retval, pointer)\ - if ((pointer) == M4OSA_NULL) return ((M4OSA_ERR)(retval)); - - -/********************** M4AIR PUBLIC API IMPLEMENTATION ********************/ -/** - ****************************************************************************** - * M4OSA_ERR M4AIR_create(M4OSA_Context* pContext,M4AIR_InputFormatType inputFormat) - * @brief This function initialize an instance of the AIR. - * @param pContext: (IN/OUT) Address of the context to create - * @param inputFormat: (IN) input format type. - * @return M4NO_ERROR: there is no error - * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only). Invalid formatType - * @return M4ERR_ALLOC: No more memory is available - ****************************************************************************** - */ -M4OSA_ERR M4AIR_create(M4OSA_Context* pContext,M4AIR_InputFormatType inputFormat) -{ - M4OSA_ERR err = M4NO_ERROR ; - M4AIR_InternalContext* pC = M4OSA_NULL ; - - /* Check that the address on the context is not NULL */ - M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext) ; - - *pContext = M4OSA_NULL ; - - /* Internal Context creation */ - pC = (M4AIR_InternalContext*)M4OSA_32bitAlignedMalloc(sizeof(M4AIR_InternalContext), - M4AIR,(M4OSA_Char *)"AIR internal context") ; - M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_ALLOC, pC) ; - - - /* Check if the input format is supported */ - switch(inputFormat) - { -#ifdef M4AIR_YUV420_FORMAT_SUPPORTED - case M4AIR_kYUV420P: - break ; -#endif -#ifdef M4AIR_YUV420A_FORMAT_SUPPORTED - case M4AIR_kYUV420AP: - break ; -#endif - default: - err = M4ERR_AIR_FORMAT_NOT_SUPPORTED; - goto M4AIR_create_cleanup ; - } - - /**< Save input format and update state */ - pC->m_inputFormat = inputFormat; - pC->m_state = M4AIR_kCreated; - - /* Return the context to the caller */ - *pContext = pC ; - - return M4NO_ERROR ; - -M4AIR_create_cleanup: - /* Error management : we destroy the context if needed */ - if(M4OSA_NULL != pC) - { - free(pC) ; - } - - *pContext = M4OSA_NULL ; - - return err ; -} - - - -/** - ****************************************************************************** - * M4OSA_ERR M4AIR_cleanUp(M4OSA_Context pContext) - * @brief This function destroys an instance of the AIR component - * @param pContext: (IN) Context identifying the instance to destroy - * @return M4NO_ERROR: there is no error - * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only). - * @return M4ERR_STATE: Internal state is incompatible with this function call. - ****************************************************************************** - */ -M4OSA_ERR M4AIR_cleanUp(M4OSA_Context pContext) -{ - M4AIR_InternalContext* pC = (M4AIR_InternalContext*)pContext ; - - M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext) ; - - /**< Check state */ - if((M4AIR_kCreated != pC->m_state)&&(M4AIR_kConfigured != pC->m_state)) - { - return M4ERR_STATE; - } - free(pC) ; - - return M4NO_ERROR ; - -} - - -/** - ****************************************************************************** - * M4OSA_ERR M4AIR_configure(M4OSA_Context pContext, M4AIR_Params* pParams) - * @brief This function will configure the AIR. - * @note It will set the input and output coordinates and sizes, - * and indicates if we will proceed in stripe or not. - * In case a M4AIR_get in stripe mode was on going, it will cancel this previous - * processing and reset the get process. - * @param pContext: (IN) Context identifying the instance - * @param pParams->m_bOutputStripe:(IN) Stripe mode. - * @param pParams->m_inputCoord: (IN) X,Y coordinates of the first valid pixel in input. - * @param pParams->m_inputSize: (IN) input ROI size. - * @param pParams->m_outputSize: (IN) output size. - * @return M4NO_ERROR: there is no error - * @return M4ERR_ALLOC: No more memory space to add a new effect. - * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only). - * @return M4ERR_AIR_FORMAT_NOT_SUPPORTED: the requested input format is not supported. - ****************************************************************************** - */ -M4OSA_ERR M4AIR_configure(M4OSA_Context pContext, M4AIR_Params* pParams) -{ - M4AIR_InternalContext* pC = (M4AIR_InternalContext*)pContext ; - M4OSA_UInt32 i,u32_width_in, u32_width_out, u32_height_in, u32_height_out; - M4OSA_UInt32 nb_planes; - - M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext) ; - - if(M4AIR_kYUV420AP == pC->m_inputFormat) - { - nb_planes = 4; - } - else - { - nb_planes = 3; - } - - /**< Check state */ - if((M4AIR_kCreated != pC->m_state)&&(M4AIR_kConfigured != pC->m_state)) - { - return M4ERR_STATE; - } - - /** Save parameters */ - pC->m_params = *pParams; - - /* Check for the input&output width and height are even */ - if( ((pC->m_params.m_inputSize.m_height)&0x1) || - ((pC->m_params.m_inputSize.m_height)&0x1)) - { - return M4ERR_AIR_ILLEGAL_FRAME_SIZE; - } - - if( ((pC->m_params.m_inputSize.m_width)&0x1) || - ((pC->m_params.m_inputSize.m_width)&0x1)) - { - return M4ERR_AIR_ILLEGAL_FRAME_SIZE; - } - if(((pC->m_params.m_inputSize.m_width) == (pC->m_params.m_outputSize.m_width)) - &&((pC->m_params.m_inputSize.m_height) == (pC->m_params.m_outputSize.m_height))) - { - /**< No resize in this case, we will just copy input in output */ - pC->m_bOnlyCopy = M4OSA_TRUE; - } - else - { - pC->m_bOnlyCopy = M4OSA_FALSE; - - /**< Initialize internal variables used for resize filter */ - for(i=0;i<nb_planes;i++) - { - - u32_width_in = ((i==0)||(i==3))?pC->m_params.m_inputSize.m_width:\ - (pC->m_params.m_inputSize.m_width+1)>>1; - u32_height_in = ((i==0)||(i==3))?pC->m_params.m_inputSize.m_height:\ - (pC->m_params.m_inputSize.m_height+1)>>1; - u32_width_out = ((i==0)||(i==3))?pC->m_params.m_outputSize.m_width:\ - (pC->m_params.m_outputSize.m_width+1)>>1; - u32_height_out = ((i==0)||(i==3))?pC->m_params.m_outputSize.m_height:\ - (pC->m_params.m_outputSize.m_height+1)>>1; - - /* Compute horizontal ratio between src and destination width.*/ - if (u32_width_out >= u32_width_in) - { - pC->u32_x_inc[i] = ((u32_width_in-1) * 0x10000) / (u32_width_out-1); - } - else - { - pC->u32_x_inc[i] = (u32_width_in * 0x10000) / (u32_width_out); - } - - /* Compute vertical ratio between src and destination height.*/ - if (u32_height_out >= u32_height_in) - { - pC->u32_y_inc[i] = ((u32_height_in - 1) * 0x10000) / (u32_height_out-1); - } - else - { - pC->u32_y_inc[i] = (u32_height_in * 0x10000) / (u32_height_out); - } - - /* - Calculate initial accumulator value : u32_y_accum_start. - u32_y_accum_start is coded on 15 bits, and represents a value between 0 and 0.5 - */ - if (pC->u32_y_inc[i] >= 0x10000) - { - /* - Keep the fractionnal part, assimung that integer part is coded - on the 16 high bits and the fractionnal on the 15 low bits - */ - pC->u32_y_accum_start[i] = pC->u32_y_inc[i] & 0xffff; - - if (!pC->u32_y_accum_start[i]) - { - pC->u32_y_accum_start[i] = 0x10000; - } - - pC->u32_y_accum_start[i] >>= 1; - } - else - { - pC->u32_y_accum_start[i] = 0; - } - /**< Take into account that Y coordinate can be odd - in this case we have to put a 0.5 offset - for U and V plane as there a 2 times sub-sampled vs Y*/ - if((pC->m_params.m_inputCoord.m_y&0x1)&&((i==1)||(i==2))) - { - pC->u32_y_accum_start[i] += 0x8000; - } - - /* - Calculate initial accumulator value : u32_x_accum_start. - u32_x_accum_start is coded on 15 bits, and represents a value between - 0 and 0.5 - */ - - if (pC->u32_x_inc[i] >= 0x10000) - { - pC->u32_x_accum_start[i] = pC->u32_x_inc[i] & 0xffff; - - if (!pC->u32_x_accum_start[i]) - { - pC->u32_x_accum_start[i] = 0x10000; - } - - pC->u32_x_accum_start[i] >>= 1; - } - else - { - pC->u32_x_accum_start[i] = 0; - } - /**< Take into account that X coordinate can be odd - in this case we have to put a 0.5 offset - for U and V plane as there a 2 times sub-sampled vs Y*/ - if((pC->m_params.m_inputCoord.m_x&0x1)&&((i==1)||(i==2))) - { - pC->u32_x_accum_start[i] += 0x8000; - } - } - } - - /**< Reset variable used for stripe mode */ - pC->m_procRows = 0; - - /**< Initialize var for X/Y processing order according to orientation */ - pC->m_bFlipX = M4OSA_FALSE; - pC->m_bFlipY = M4OSA_FALSE; - pC->m_bRevertXY = M4OSA_FALSE; - switch(pParams->m_outputOrientation) - { - case M4COMMON_kOrientationTopLeft: - break; - case M4COMMON_kOrientationTopRight: - pC->m_bFlipX = M4OSA_TRUE; - break; - case M4COMMON_kOrientationBottomRight: - pC->m_bFlipX = M4OSA_TRUE; - pC->m_bFlipY = M4OSA_TRUE; - break; - case M4COMMON_kOrientationBottomLeft: - pC->m_bFlipY = M4OSA_TRUE; - break; - case M4COMMON_kOrientationLeftTop: - pC->m_bRevertXY = M4OSA_TRUE; - break; - case M4COMMON_kOrientationRightTop: - pC->m_bRevertXY = M4OSA_TRUE; - pC->m_bFlipY = M4OSA_TRUE; - break; - case M4COMMON_kOrientationRightBottom: - pC->m_bRevertXY = M4OSA_TRUE; - pC->m_bFlipX = M4OSA_TRUE; - pC->m_bFlipY = M4OSA_TRUE; - break; - case M4COMMON_kOrientationLeftBottom: - pC->m_bRevertXY = M4OSA_TRUE; - pC->m_bFlipX = M4OSA_TRUE; - break; - default: - return M4ERR_PARAMETER; - } - /**< Update state */ - pC->m_state = M4AIR_kConfigured; - - return M4NO_ERROR ; -} - - -/** - ****************************************************************************** - * M4OSA_ERR M4AIR_get(M4OSA_Context pContext, M4VIFI_ImagePlane* pIn, M4VIFI_ImagePlane* pOut) - * @brief This function will provide the requested resized area of interest according to - * settings provided in M4AIR_configure. - * @note In case the input format type is JPEG, input plane(s) - * in pIn is not used. In normal mode, dimension specified in output plane(s) structure - * must be the same than the one specified in M4AIR_configure. In stripe mode, only the - * width will be the same, height will be taken as the stripe height (typically 16). - * In normal mode, this function is call once to get the full output picture. - * In stripe mode, it is called for each stripe till the whole picture has been - * retrieved,and the position of the output stripe in the output picture - * is internally incremented at each step. - * Any call to M4AIR_configure during stripe process will reset this one to the - * beginning of the output picture. - * @param pContext: (IN) Context identifying the instance - * @param pIn: (IN) Plane structure containing input Plane(s). - * @param pOut: (IN/OUT) Plane structure containing output Plane(s). - * @return M4NO_ERROR: there is no error - * @return M4ERR_ALLOC: No more memory space to add a new effect. - * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only). - ****************************************************************************** - */ -M4OSA_ERR M4AIR_get(M4OSA_Context pContext, M4VIFI_ImagePlane* pIn, M4VIFI_ImagePlane* pOut) -{ - M4AIR_InternalContext* pC = (M4AIR_InternalContext*)pContext ; - M4OSA_UInt32 i,j,k,u32_x_frac,u32_y_frac,u32_x_accum,u32_y_accum,u32_shift; - M4OSA_UInt8 *pu8_data_in, *pu8_data_in_org, *pu8_data_in_tmp, *pu8_data_out; - M4OSA_UInt8 *pu8_src_top; - M4OSA_UInt8 *pu8_src_bottom; - M4OSA_UInt32 u32_temp_value; - M4OSA_Int32 i32_tmp_offset; - M4OSA_UInt32 nb_planes; - - - - M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext) ; - - /**< Check state */ - if(M4AIR_kConfigured != pC->m_state) - { - return M4ERR_STATE; - } - - if(M4AIR_kYUV420AP == pC->m_inputFormat) - { - nb_planes = 4; - } - else - { - nb_planes = 3; - } - - /**< Loop on each Plane */ - for(i=0;i<nb_planes;i++) - { - - /* Set the working pointers at the beginning of the input/output data field */ - - u32_shift = ((i==0)||(i==3))?0:1; /**< Depend on Luma or Chroma */ - - if((M4OSA_FALSE == pC->m_params.m_bOutputStripe)\ - ||((M4OSA_TRUE == pC->m_params.m_bOutputStripe)&&(0 == pC->m_procRows))) - { - /**< For input, take care about ROI */ - pu8_data_in = pIn[i].pac_data + pIn[i].u_topleft \ - + (pC->m_params.m_inputCoord.m_x>>u32_shift) - + (pC->m_params.m_inputCoord.m_y >> u32_shift) * pIn[i].u_stride; - - /** Go at end of line/column in case X/Y scanning is flipped */ - if(M4OSA_TRUE == pC->m_bFlipX) - { - pu8_data_in += ((pC->m_params.m_inputSize.m_width)>>u32_shift) -1 ; - } - if(M4OSA_TRUE == pC->m_bFlipY) - { - pu8_data_in += ((pC->m_params.m_inputSize.m_height>>u32_shift) -1)\ - * pIn[i].u_stride; - } - - /**< Initialize accumulators in case we are using it (bilinear interpolation) */ - if( M4OSA_FALSE == pC->m_bOnlyCopy) - { - pC->u32_x_accum[i] = pC->u32_x_accum_start[i]; - pC->u32_y_accum[i] = pC->u32_y_accum_start[i]; - } - - } - else - { - /**< In case of stripe mode for other than first stripe, we need to recover input - pointer from internal context */ - pu8_data_in = pC->pu8_data_in[i]; - } - - /**< In every mode, output data are at the beginning of the output plane */ - pu8_data_out = pOut[i].pac_data + pOut[i].u_topleft; - - /**< Initialize input offset applied after each pixel */ - if(M4OSA_FALSE == pC->m_bFlipY) - { - i32_tmp_offset = pIn[i].u_stride; - } - else - { - i32_tmp_offset = -pIn[i].u_stride; - } - - /**< In this case, no bilinear interpolation is needed as input and output dimensions - are the same */ - if( M4OSA_TRUE == pC->m_bOnlyCopy) - { - /**< No +-90° rotation */ - if(M4OSA_FALSE == pC->m_bRevertXY) - { - /**< No flip on X abscissa */ - if(M4OSA_FALSE == pC->m_bFlipX) - { - /**< Loop on each row */ - for(j=0;j<pOut[i].u_height;j++) - { - /**< Copy one whole line */ - memcpy((void *)pu8_data_out, (void *)pu8_data_in, - pOut[i].u_width); - - /**< Update pointers */ - pu8_data_out += pOut[i].u_stride; - if(M4OSA_FALSE == pC->m_bFlipY) - { - pu8_data_in += pIn[i].u_stride; - } - else - { - pu8_data_in -= pIn[i].u_stride; - } - } - } - else - { - /**< Loop on each row */ - for(j=0;j<pOut[i].u_height;j++) - { - /**< Loop on each pixel of 1 row */ - for(k=0;k<pOut[i].u_width;k++) - { - *pu8_data_out++ = *pu8_data_in--; - } - - /**< Update pointers */ - pu8_data_out += (pOut[i].u_stride - pOut[i].u_width); - - pu8_data_in += pOut[i].u_width + i32_tmp_offset; - - } - } - } - /**< Here we have a +-90° rotation */ - else - { - - /**< Loop on each row */ - for(j=0;j<pOut[i].u_height;j++) - { - pu8_data_in_tmp = pu8_data_in; - - /**< Loop on each pixel of 1 row */ - for(k=0;k<pOut[i].u_width;k++) - { - *pu8_data_out++ = *pu8_data_in_tmp; - - /**< Update input pointer in order to go to next/past line */ - pu8_data_in_tmp += i32_tmp_offset; - } - - /**< Update pointers */ - pu8_data_out += (pOut[i].u_stride - pOut[i].u_width); - if(M4OSA_FALSE == pC->m_bFlipX) - { - pu8_data_in ++; - } - else - { - pu8_data_in --; - } - } - } - } - /**< Bilinear interpolation */ - else - { - - if(3 != i) /**< other than alpha plane */ - { - /**No +-90° rotation */ - if(M4OSA_FALSE == pC->m_bRevertXY) - { - - /**< Loop on each row */ - for(j=0;j<pOut[i].u_height;j++) - { - /* Vertical weight factor */ - u32_y_frac = (pC->u32_y_accum[i]>>12)&15; - - /* Reinit horizontal weight factor */ - u32_x_accum = pC->u32_x_accum_start[i]; - - - - if(M4OSA_TRUE == pC->m_bFlipX) - { - - /**< Loop on each output pixel in a row */ - for(k=0;k<pOut[i].u_width;k++) - { - - u32_x_frac = (u32_x_accum >> 12)&15; /* Fraction of Horizontal - weight factor */ - - pu8_src_top = (pu8_data_in - (u32_x_accum >> 16)) -1 ; - - pu8_src_bottom = pu8_src_top + i32_tmp_offset; - - /* Weighted combination */ - u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[1]*(16-u32_x_frac) + - pu8_src_top[0]*u32_x_frac)*(16-u32_y_frac) + - (pu8_src_bottom[1]*(16-u32_x_frac) + - pu8_src_bottom[0]*u32_x_frac)*u32_y_frac )>>8); - - *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; - - /* Update horizontal accumulator */ - u32_x_accum += pC->u32_x_inc[i]; - } - } - - else - { - /**< Loop on each output pixel in a row */ - for(k=0;k<pOut[i].u_width;k++) - { - u32_x_frac = (u32_x_accum >> 12)&15; /* Fraction of Horizontal - weight factor */ - - pu8_src_top = pu8_data_in + (u32_x_accum >> 16); - - pu8_src_bottom = pu8_src_top + i32_tmp_offset; - - /* Weighted combination */ - u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[0]*(16-u32_x_frac) + - pu8_src_top[1]*u32_x_frac)*(16-u32_y_frac) + - (pu8_src_bottom[0]*(16-u32_x_frac) + - pu8_src_bottom[1]*u32_x_frac)*u32_y_frac )>>8); - - *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; - - /* Update horizontal accumulator */ - u32_x_accum += pC->u32_x_inc[i]; - } - - } - - pu8_data_out += pOut[i].u_stride - pOut[i].u_width; - - /* Update vertical accumulator */ - pC->u32_y_accum[i] += pC->u32_y_inc[i]; - if (pC->u32_y_accum[i]>>16) - { - pu8_data_in = pu8_data_in + (pC->u32_y_accum[i] >> 16) * i32_tmp_offset; - pC->u32_y_accum[i] &= 0xffff; - } - } - } - /** +-90° rotation */ - else - { - pu8_data_in_org = pu8_data_in; - - /**< Loop on each output row */ - for(j=0;j<pOut[i].u_height;j++) - { - /* horizontal weight factor */ - u32_x_frac = (pC->u32_x_accum[i]>>12)&15; - - /* Reinit accumulator */ - u32_y_accum = pC->u32_y_accum_start[i]; - - if(M4OSA_TRUE == pC->m_bFlipX) - { - - /**< Loop on each output pixel in a row */ - for(k=0;k<pOut[i].u_width;k++) - { - - u32_y_frac = (u32_y_accum >> 12)&15; /* Vertical weight factor */ - - - pu8_src_top = (pu8_data_in - (pC->u32_x_accum[i] >> 16)) - 1; - - pu8_src_bottom = pu8_src_top + i32_tmp_offset; - - /* Weighted combination */ - u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[1]*(16-u32_x_frac) + - pu8_src_top[0]*u32_x_frac)*(16-u32_y_frac) + - (pu8_src_bottom[1]*(16-u32_x_frac) + - pu8_src_bottom[0]*u32_x_frac)*u32_y_frac )>>8); - - *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; - - /* Update vertical accumulator */ - u32_y_accum += pC->u32_y_inc[i]; - if (u32_y_accum>>16) - { - pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * i32_tmp_offset; - u32_y_accum &= 0xffff; - } - - } - } - else - { - /**< Loop on each output pixel in a row */ - for(k=0;k<pOut[i].u_width;k++) - { - - u32_y_frac = (u32_y_accum >> 12)&15; /* Vertical weight factor */ - - pu8_src_top = pu8_data_in + (pC->u32_x_accum[i] >> 16); - - pu8_src_bottom = pu8_src_top + i32_tmp_offset; - - /* Weighted combination */ - u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[0]*(16-u32_x_frac) + - pu8_src_top[1]*u32_x_frac)*(16-u32_y_frac) + - (pu8_src_bottom[0]*(16-u32_x_frac) + - pu8_src_bottom[1]*u32_x_frac)*u32_y_frac )>>8); - - *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; - - /* Update vertical accumulator */ - u32_y_accum += pC->u32_y_inc[i]; - if (u32_y_accum>>16) - { - pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * i32_tmp_offset; - u32_y_accum &= 0xffff; - } - } - } - pu8_data_out += pOut[i].u_stride - pOut[i].u_width; - - /* Update horizontal accumulator */ - pC->u32_x_accum[i] += pC->u32_x_inc[i]; - - pu8_data_in = pu8_data_in_org; - } - - } - }/** 3 != i */ - else - { - /**No +-90° rotation */ - if(M4OSA_FALSE == pC->m_bRevertXY) - { - - /**< Loop on each row */ - for(j=0;j<pOut[i].u_height;j++) - { - /* Vertical weight factor */ - u32_y_frac = (pC->u32_y_accum[i]>>12)&15; - - /* Reinit horizontal weight factor */ - u32_x_accum = pC->u32_x_accum_start[i]; - - - - if(M4OSA_TRUE == pC->m_bFlipX) - { - - /**< Loop on each output pixel in a row */ - for(k=0;k<pOut[i].u_width;k++) - { - - u32_x_frac = (u32_x_accum >> 12)&15; /* Fraction of Horizontal - weight factor */ - - pu8_src_top = (pu8_data_in - (u32_x_accum >> 16)) -1 ; - - pu8_src_bottom = pu8_src_top + i32_tmp_offset; - - /* Weighted combination */ - u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[1]*(16-u32_x_frac) + - pu8_src_top[0]*u32_x_frac)*(16-u32_y_frac) + - (pu8_src_bottom[1]*(16-u32_x_frac) + - pu8_src_bottom[0]*u32_x_frac)*u32_y_frac )>>8); - - u32_temp_value= (u32_temp_value >> 7)*0xff; - - *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; - - /* Update horizontal accumulator */ - u32_x_accum += pC->u32_x_inc[i]; - } - } - - else - { - /**< Loop on each output pixel in a row */ - for(k=0;k<pOut[i].u_width;k++) - { - u32_x_frac = (u32_x_accum >> 12)&15; /* Fraction of Horizontal - weight factor */ - - pu8_src_top = pu8_data_in + (u32_x_accum >> 16); - - pu8_src_bottom = pu8_src_top + i32_tmp_offset; - - /* Weighted combination */ - u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[0]*(16-u32_x_frac) + - pu8_src_top[1]*u32_x_frac)*(16-u32_y_frac) + - (pu8_src_bottom[0]*(16-u32_x_frac) + - pu8_src_bottom[1]*u32_x_frac)*u32_y_frac )>>8); - - u32_temp_value= (u32_temp_value >> 7)*0xff; - - *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; - - /* Update horizontal accumulator */ - u32_x_accum += pC->u32_x_inc[i]; - } - - } - - pu8_data_out += pOut[i].u_stride - pOut[i].u_width; - - /* Update vertical accumulator */ - pC->u32_y_accum[i] += pC->u32_y_inc[i]; - if (pC->u32_y_accum[i]>>16) - { - pu8_data_in = pu8_data_in + (pC->u32_y_accum[i] >> 16) * i32_tmp_offset; - pC->u32_y_accum[i] &= 0xffff; - } - } - - } /**< M4OSA_FALSE == pC->m_bRevertXY */ - /** +-90° rotation */ - else - { - pu8_data_in_org = pu8_data_in; - - /**< Loop on each output row */ - for(j=0;j<pOut[i].u_height;j++) - { - /* horizontal weight factor */ - u32_x_frac = (pC->u32_x_accum[i]>>12)&15; - - /* Reinit accumulator */ - u32_y_accum = pC->u32_y_accum_start[i]; - - if(M4OSA_TRUE == pC->m_bFlipX) - { - - /**< Loop on each output pixel in a row */ - for(k=0;k<pOut[i].u_width;k++) - { - - u32_y_frac = (u32_y_accum >> 12)&15; /* Vertical weight factor */ - - - pu8_src_top = (pu8_data_in - (pC->u32_x_accum[i] >> 16)) - 1; - - pu8_src_bottom = pu8_src_top + i32_tmp_offset; - - /* Weighted combination */ - u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[1]*(16-u32_x_frac) + - pu8_src_top[0]*u32_x_frac)*(16-u32_y_frac) + - (pu8_src_bottom[1]*(16-u32_x_frac) + - pu8_src_bottom[0]*u32_x_frac)*u32_y_frac )>>8); - - u32_temp_value= (u32_temp_value >> 7)*0xff; - - *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; - - /* Update vertical accumulator */ - u32_y_accum += pC->u32_y_inc[i]; - if (u32_y_accum>>16) - { - pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * i32_tmp_offset; - u32_y_accum &= 0xffff; - } - - } - } - else - { - /**< Loop on each output pixel in a row */ - for(k=0;k<pOut[i].u_width;k++) - { - - u32_y_frac = (u32_y_accum >> 12)&15; /* Vertical weight factor */ - - pu8_src_top = pu8_data_in + (pC->u32_x_accum[i] >> 16); - - pu8_src_bottom = pu8_src_top + i32_tmp_offset; - - /* Weighted combination */ - u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[0]*(16-u32_x_frac) + - pu8_src_top[1]*u32_x_frac)*(16-u32_y_frac) + - (pu8_src_bottom[0]*(16-u32_x_frac) + - pu8_src_bottom[1]*u32_x_frac)*u32_y_frac )>>8); - - u32_temp_value= (u32_temp_value >> 7)*0xff; - - *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; - - /* Update vertical accumulator */ - u32_y_accum += pC->u32_y_inc[i]; - if (u32_y_accum>>16) - { - pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * i32_tmp_offset; - u32_y_accum &= 0xffff; - } - } - } - pu8_data_out += pOut[i].u_stride - pOut[i].u_width; - - /* Update horizontal accumulator */ - pC->u32_x_accum[i] += pC->u32_x_inc[i]; - - pu8_data_in = pu8_data_in_org; - - } - } /**< M4OSA_TRUE == pC->m_bRevertXY */ - }/** 3 == i */ - } - /**< In case of stripe mode, save current input pointer */ - if(M4OSA_TRUE == pC->m_params.m_bOutputStripe) - { - pC->pu8_data_in[i] = pu8_data_in; - } - } - - /**< Update number of processed rows, reset it if we have finished - with the whole processing */ - pC->m_procRows += pOut[0].u_height; - if(M4OSA_FALSE == pC->m_bRevertXY) - { - if(pC->m_params.m_outputSize.m_height <= pC->m_procRows) pC->m_procRows = 0; - } - else - { - if(pC->m_params.m_outputSize.m_width <= pC->m_procRows) pC->m_procRows = 0; - } - - return M4NO_ERROR ; - -} - - - diff --git a/libvideoeditor/vss/src/M4AMRR_CoreReader.c b/libvideoeditor/vss/src/M4AMRR_CoreReader.c deleted file mode 100755 index 630f9dc..0000000 --- a/libvideoeditor/vss/src/M4AMRR_CoreReader.c +++ /dev/null @@ -1,909 +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 M4AMRR_CoreReader.c - * @brief Implementation of AMR parser - * @note This file contains the API Implementation for - * AMR Parser. - ****************************************************************************** -*/ -#include "M4AMRR_CoreReader.h" -#include "M4OSA_Debug.h" -#include "M4OSA_CoreID.h" - -/** - ****************************************************************************** - * Maximum bitrate per amr type - ****************************************************************************** -*/ -#define M4AMRR_NB_MAX_BIT_RATE 12200 -#define M4AMRR_WB_MAX_BIT_RATE 23850 - -/** - ****************************************************************************** - * AMR reader context ID - ****************************************************************************** -*/ -#define M4AMRR_CONTEXTID 0x414d5252 - -/** - ****************************************************************************** - * An AMR frame is 20ms - ****************************************************************************** -*/ -#define M4AMRR_FRAME_LENGTH 20 - -/** - ****************************************************************************** - * For the seek, the file is splitted in 40 segments for faster search - ****************************************************************************** -*/ -#define M4AMRR_NUM_SEEK_ENTRIES 40 - -#define M4AMRR_NB_SAMPLE_FREQUENCY 8000 /**< Narrow band sampling rate */ -#define M4AMRR_WB_SAMPLE_FREQUENCY 16000 /**< Wide band sampling rate */ - -/** - ****************************************************************************** - * AMR reader version numbers - ****************************************************************************** -*/ -/* CHANGE_VERSION_HERE */ -#define M4AMRR_VERSION_MAJOR 1 -#define M4AMRR_VERSION_MINOR 11 -#define M4AMRR_VERSION_REVISION 3 - -/** - ****************************************************************************** - * structure M4_AMRR_Context - * @brief Internal AMR reader context structure - ****************************************************************************** -*/ -typedef struct -{ - M4OSA_UInt32 m_contextId ; /* Fixed Id. to check for valid Context*/ - M4OSA_FileReadPointer* m_pOsaFilePtrFct; /* File function pointer */ - M4SYS_StreamDescription* m_pStreamHandler; /* Stream Description */ - M4OSA_UInt32* m_pSeekIndex; /* Seek Index Table */ - M4OSA_UInt32 m_seekInterval; /* Stores the seek Interval stored in the Index */ - M4OSA_UInt32 m_maxAuSize; /* Stores the max Au Size */ - M4OSA_MemAddr32 m_pdataAddress; /* Pointer to store AU data */ - M4SYS_StreamType m_streamType; /* Stores the stream type AMR NB or WB */ - M4OSA_Context m_pAMRFile; /* Data storage */ - M4AMRR_State m_status; /* AMR Reader Status */ - M4OSA_Int32 m_structSize; /* size of structure*/ -} M4_AMRR_Context; - -/** - ****************************************************************************** - * Parser internal functions, not usable from outside the reader context - ****************************************************************************** -*/ -M4OSA_UInt32 M4AMRR_getAuSize(M4OSA_UInt32 frameType, M4SYS_StreamType streamType); -M4OSA_UInt32 M4AMRR_getBitrate(M4OSA_UInt32 frameType, M4SYS_StreamType streamType); - -/** - ****************************************************************************** - * M4OSA_UInt32 M4AMRR_getAuSize(M4OSA_UInt32 frameType, M4SYS_StreamType streamType) - * @brief Internal function to the AMR Parser, returns the AU size of the Frame - * @note This function takes the stream type and the frametype and returns the - * frame lenght - * @param frameType(IN) : AMR frame type - * @param streamType(IN) : AMR stream type NB or WB - * @returns The frame size based on the frame type. - ****************************************************************************** - */ -M4OSA_UInt32 M4AMRR_getAuSize(M4OSA_UInt32 frameType, M4SYS_StreamType streamType) -{ - const M4OSA_UInt32 M4AMRR_NB_AUSIZE[]={13,14,16,18,20,21,27,32,6,6,6}; - const M4OSA_UInt32 M4AMRR_WB_AUSIZE[]={18,24,33,37,41,47,51,59,61,6}; - - if ( streamType == M4SYS_kAMR ) - { - return M4AMRR_NB_AUSIZE[frameType]; - } - else /* M4SYS_kAMR_WB */ - { - return M4AMRR_WB_AUSIZE[frameType]; - } -} - -/** - ****************************************************************************** - * M4OSA_UInt32 M4AMRR_getBitrate(M4OSA_UInt32 frameType, M4SYS_StreamType streamType) - * @brief Internal function to the AMR Parser, returns the Bit rate of the Frame - * @note This function takes the stream type and the frametype and returns the - * bit rate for the given frame. - * @param frameType(IN) : AMR frame type - * @param streamType(IN) : AMR stream type NB or WB - * @returns The frame's bit rate based on the frame type. - ****************************************************************************** - */ -M4OSA_UInt32 M4AMRR_getBitrate(M4OSA_UInt32 frameType, M4SYS_StreamType streamType) -{ - const M4OSA_UInt32 M4AMRR_NB_BITRATE[]= - {4750,5150,5900,6700,7400,7950,10200,12200,12200,12200,12200}; - const M4OSA_UInt32 M4AMRR_WB_BITRATE[]= - {6600,8850,12650,14250,15850,18250,19850,23050,23850,12200}; - - if ( streamType == M4SYS_kAMR ) - { - return M4AMRR_NB_BITRATE[frameType]; - } - else /* M4SYS_kAMR_WB */ - { - return M4AMRR_WB_BITRATE[frameType]; - } -} - -/*********************************************************/ -M4OSA_ERR M4AMRR_openRead(M4OSA_Context* pContext, M4OSA_Void* pFileDescriptor, - M4OSA_FileReadPointer* pFileFunction) -/*********************************************************/ -{ - M4_AMRR_Context* pStreamContext; - M4OSA_FilePosition filePos; - - M4OSA_ERR err = M4ERR_FILE_NOT_FOUND ; - M4OSA_UInt32 size ; - M4OSA_UInt32 data ; - M4OSA_Char *M4_Token; - M4OSA_UInt32 *tokenPtr; - - /* Header for AMR NB */ - M4OSA_UInt32 M4_AMR_1 = 0x4d412123; - M4OSA_UInt32 M4_AMR_NB_2 = 0x00000a52; - - /* Header for AMR WB */ - M4OSA_UInt32 M4_AMR_WB_2 = 0x42572d52; - M4OSA_UInt32 M4_AMR_WB_3 = 0x0000000a; - *pContext = M4OSA_NULL ; - - M4OSA_DEBUG_IF2((M4OSA_NULL == pContext),M4ERR_PARAMETER,"Context M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pFileDescriptor),M4ERR_PARAMETER,"File Desc. M4OSA_NULL"); - - M4_Token = (M4OSA_Char*)M4OSA_32bitAlignedMalloc(sizeof(M4OSA_MemAddr32)*3, M4AMR_READER, - (M4OSA_Char *)("M4_Token")); - if(M4OSA_NULL == M4_Token) - { - M4OSA_DEBUG_IF3((M4OSA_NULL == M4_Token),M4ERR_ALLOC,"Mem Alloc failed - M4_Token"); - return M4ERR_ALLOC ; - } - - pStreamContext= (M4_AMRR_Context*)M4OSA_32bitAlignedMalloc(sizeof(M4_AMRR_Context), M4AMR_READER, - (M4OSA_Char *)("pStreamContext")); - if(M4OSA_NULL == pStreamContext) - { - free(M4_Token); - *pContext = M4OSA_NULL ; - return M4ERR_ALLOC ; - } - - /* Initialize the context */ - pStreamContext->m_contextId = M4AMRR_CONTEXTID; - pStreamContext->m_structSize=sizeof(M4_AMRR_Context); - pStreamContext->m_pOsaFilePtrFct=pFileFunction ; - pStreamContext->m_pStreamHandler = M4OSA_NULL ; - pStreamContext->m_pAMRFile = M4OSA_NULL ; - pStreamContext->m_status = M4AMRR_kOpening ; - pStreamContext->m_pSeekIndex = M4OSA_NULL ; - pStreamContext->m_seekInterval = 0; - pStreamContext->m_maxAuSize = 0 ; - pStreamContext->m_pdataAddress = M4OSA_NULL; - err=pStreamContext->m_pOsaFilePtrFct->openRead(&pStreamContext->m_pAMRFile, - (M4OSA_Char*)pFileDescriptor,M4OSA_kFileRead ); - if ( err != M4NO_ERROR ) - { - /* M4OSA_DEBUG_IF3((err != M4NO_ERROR),err,"File open failed"); */ - free(pStreamContext); - free(M4_Token); - *pContext = M4OSA_NULL ; - return err ; - } - - pStreamContext->m_status = M4AMRR_kOpening ; - - size = 6; - pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, - (M4OSA_MemAddr8)M4_Token, &size); - if(size != 6) - { - goto cleanup; - } - - tokenPtr = (M4OSA_UInt32*)M4_Token ; - /* Check for the first 4 bytes of the header common to WB and NB*/ - if (*tokenPtr != M4_AMR_1) - { - goto cleanup; - } - - tokenPtr++; - data = *tokenPtr & 0x0000FFFF ; - /* Check if the next part is Narrow band header */ - if (data!= M4_AMR_NB_2) - { - /* Stream is AMR Wide Band */ - filePos = 4; - pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, - M4OSA_kFileSeekBeginning, &filePos); - size = 5; - pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, - (M4OSA_MemAddr8)M4_Token, &size); - if(size != 5) - goto cleanup; - tokenPtr=(M4OSA_UInt32*)M4_Token; - /* Check for the Wide band hader */ - if(*tokenPtr!= M4_AMR_WB_2) - goto cleanup; - tokenPtr++; - data = *tokenPtr & 0x000000FF ; - if(data!= M4_AMR_WB_3) - goto cleanup; - pStreamContext->m_streamType = M4SYS_kAMR_WB ; - } - else - { - /* Stream is a Narrow band stream */ - pStreamContext->m_streamType = M4SYS_kAMR ; - } - /* No Profile level defined */ - pStreamContext->m_status = M4AMRR_kOpened; - - free(M4_Token); - *pContext = pStreamContext ; - return M4NO_ERROR; - -cleanup: - - if(M4OSA_NULL != pStreamContext->m_pAMRFile) - { - pStreamContext->m_pOsaFilePtrFct->closeRead(pStreamContext->m_pAMRFile); - } - - free(M4_Token); - free(pStreamContext); - - *pContext = M4OSA_NULL ; - - return (M4OSA_ERR)M4ERR_AMR_NOT_COMPLIANT; -} - - -/*********************************************************/ -M4OSA_ERR M4AMRR_getNextStream(M4OSA_Context Context, M4SYS_StreamDescription* pStreamDesc ) -/*********************************************************/ -{ - M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; - M4OSA_Char frameHeader, frameType ; - M4OSA_UInt32 size, auCount=0; - M4OSA_FilePosition filePos; - - M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pStreamDesc),M4ERR_PARAMETER,"Stream Desc. M4OSA_NULL"); - M4OSA_DEBUG_IF2((pStreamContext->m_contextId != M4AMRR_CONTEXTID),M4ERR_BAD_CONTEXT, - "Bad Context"); - M4OSA_DEBUG_IF1(( pStreamContext->m_status != M4AMRR_kOpened), M4ERR_STATE, "Invalid State"); - - if (M4OSA_NULL != pStreamContext->m_pStreamHandler) - { - return M4WAR_NO_MORE_STREAM ; - } - - size = 1; - pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, - (M4OSA_MemAddr8)&frameHeader, &size); - - /* XFFF FXXX -> F is the Frame type */ - frameType = ( frameHeader & 0x78 ) >> 3 ; - - if ( frameType == 15 ) - { - return M4WAR_NO_DATA_YET ; - } - - if (( pStreamContext->m_streamType == M4SYS_kAMR ) && ( frameType > 11 )) - { - return (M4OSA_ERR)M4ERR_AMR_INVALID_FRAME_TYPE; - } - - if (( pStreamContext->m_streamType == M4SYS_kAMR_WB ) && ( frameType > 9 )) - { - return (M4OSA_ERR)M4ERR_AMR_INVALID_FRAME_TYPE; - } - - /* Average bit rate is assigned the bitrate of the first frame */ - pStreamDesc->averageBitrate = M4AMRR_getBitrate(frameType,pStreamContext->m_streamType); - - filePos = -1; - pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, M4OSA_kFileSeekCurrent, - &filePos); - - /* Initialize pStreamDesc */ - pStreamDesc->profileLevel = 0xFF ; - pStreamDesc->decoderSpecificInfoSize = 0 ; - pStreamDesc->decoderSpecificInfo = M4OSA_NULL ; - pStreamDesc->maxBitrate = (pStreamContext->m_streamType == - M4SYS_kAMR )?M4AMRR_NB_MAX_BIT_RATE:M4AMRR_WB_MAX_BIT_RATE; - pStreamDesc->profileLevel = 0xFF ; - pStreamDesc->streamID = 1; - pStreamDesc->streamType = pStreamContext->m_streamType; - - /* Timescale equals Sampling Frequency: NB-8000 Hz, WB-16000 Hz */ - pStreamDesc->timeScale = (pStreamContext->m_streamType == M4SYS_kAMR )?8000:16000; - pStreamDesc->duration = M4OSA_TIME_UNKNOWN; - - pStreamContext->m_pStreamHandler = - (M4SYS_StreamDescription*)M4OSA_32bitAlignedMalloc(sizeof(M4SYS_StreamDescription), - M4AMR_READER, (M4OSA_Char *)("pStreamContext->m_pStreamHandler")); - if(M4OSA_NULL == pStreamContext->m_pStreamHandler) - { - return M4ERR_ALLOC; - } - - /* Copy the Stream Desc. into the Context */ - pStreamContext->m_pStreamHandler->averageBitrate = pStreamDesc->averageBitrate; - pStreamContext->m_pStreamHandler->decoderSpecificInfo = M4OSA_NULL ; - pStreamContext->m_pStreamHandler->decoderSpecificInfoSize = 0 ; - pStreamContext->m_pStreamHandler->duration = M4OSA_TIME_UNKNOWN; - pStreamContext->m_pStreamHandler->profileLevel = 0xFF ; - pStreamContext->m_pStreamHandler->streamID = 1; - pStreamContext->m_pStreamHandler->streamType = pStreamDesc->streamType ; - pStreamContext->m_pStreamHandler->timeScale = pStreamDesc->timeScale ; - - /* Count the number of Access Unit in the File to get the */ - /* duration of the stream = 20 ms * number of access unit */ - while(1) - { - size = 1; - pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, - (M4OSA_MemAddr8)&frameHeader, &size); - if ( size == 0) - break ; - frameType = (frameHeader & 0x78) >> 3 ; - /* Get the frame size and skip so many bytes */ - if(frameType != 15){ - /* GLA 20050628 when frametype is >10 we read over a table */ - if(frameType > 10) - continue ; - - size = M4AMRR_getAuSize(frameType, pStreamContext->m_streamType); - if(size > pStreamContext->m_maxAuSize ) - { - pStreamContext->m_maxAuSize = size ; - } - filePos = size-1; - pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, - M4OSA_kFileSeekCurrent, &filePos); - auCount++; - } - } - - /* Each Frame is 20 m Sec. */ - pStreamContext->m_pStreamHandler->duration = auCount * M4AMRR_FRAME_LENGTH ; - pStreamDesc->duration = pStreamContext->m_pStreamHandler->duration ; - - /* Put the file pointer back at the first Access unit */ - if( pStreamContext->m_streamType == M4SYS_kAMR ) - { - filePos = 6; - pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, - M4OSA_kFileSeekBeginning, &filePos); - } - if ( pStreamContext->m_streamType == M4SYS_kAMR_WB ) - { - filePos = 9; - pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, - M4OSA_kFileSeekBeginning, &filePos); - } - return M4NO_ERROR ; -} - -/*********************************************************/ -M4OSA_ERR M4AMRR_startReading(M4OSA_Context Context, M4SYS_StreamID* pStreamIDs ) -/*********************************************************/ -{ - M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; - M4OSA_Int32 size = 0 ; - - M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pStreamIDs),M4ERR_PARAMETER,"Stream Ids. M4OSA_NULL"); - M4OSA_DEBUG_IF2((pStreamContext->m_contextId != M4AMRR_CONTEXTID),M4ERR_BAD_CONTEXT, - "Bad Context"); - M4OSA_DEBUG_IF1(( pStreamContext->m_status != M4AMRR_kOpened), M4ERR_STATE, "Invalid State"); - - while( pStreamIDs[size] != 0 ) - { - if( pStreamIDs[size++] != 1 ) - { - return M4ERR_BAD_STREAM_ID ; - } - } - - /* Allocate memory for data Address for use in NextAU() */ - if(M4OSA_NULL == pStreamContext->m_pdataAddress) - { - size = pStreamContext->m_maxAuSize ; - /* dataAddress is owned by Parser, application should not delete or free it */ - pStreamContext->m_pdataAddress =(M4OSA_MemAddr32)M4OSA_32bitAlignedMalloc(size + (4 - size % 4), - M4AMR_READER, (M4OSA_Char *)("pStreamContext->m_pdataAddress")); - if(M4OSA_NULL == pStreamContext->m_pdataAddress) - { - M4OSA_DEBUG_IF3((M4OSA_NULL == pStreamContext->m_pdataAddress),M4ERR_ALLOC, - "Mem Alloc failed - dataAddress"); - return M4ERR_ALLOC; - } - } - - /* Set the state of context to Reading */ - pStreamContext->m_status = M4AMRR_kReading ; - - return M4NO_ERROR ; -} - - -/*********************************************************/ -M4OSA_ERR M4AMRR_nextAU(M4OSA_Context Context, M4SYS_StreamID StreamID, M4SYS_AccessUnit* pAu) -/*********************************************************/ -{ - M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; - M4OSA_Char frameHeader ; - M4OSA_Char frameType ; - M4OSA_Int32 auSize; - M4OSA_UInt32 size ; - M4OSA_FilePosition filePos; - - M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pAu),M4ERR_PARAMETER,"Access Unit . M4OSA_NULL"); - M4OSA_DEBUG_IF2((pStreamContext->m_contextId != M4AMRR_CONTEXTID),M4ERR_BAD_CONTEXT, - "Bad Context"); - M4OSA_DEBUG_IF1(( pStreamContext->m_status != M4AMRR_kReading), M4ERR_STATE, "Invalid State"); - - if ( StreamID != 1 ) - { - return M4ERR_BAD_STREAM_ID; - } - - /* Read the frame header byte */ - size = pStreamContext->m_maxAuSize; - pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, - (M4OSA_MemAddr8)pStreamContext->m_pdataAddress, &size); - if(size != pStreamContext->m_maxAuSize) - { - return M4WAR_NO_MORE_AU; - } - - frameHeader = ((M4OSA_MemAddr8)pStreamContext->m_pdataAddress)[0]; - - frameType = ( frameHeader & 0x78 ) >> 3 ; - - if (( pStreamContext->m_streamType == M4SYS_kAMR ) && - ( frameType > 11 ) && ( frameType != 15 )) - { - return (M4OSA_ERR)M4ERR_AMR_INVALID_FRAME_TYPE; - } - - if (( pStreamContext->m_streamType == M4SYS_kAMR_WB ) && - ( frameType > 9 ) && ( frameType != 15 )) - { - return (M4OSA_ERR)M4ERR_AMR_INVALID_FRAME_TYPE; - } - - /* Get the frame size */ - if(frameType == 15) - { - auSize = 1; - } - else - { - auSize = M4AMRR_getAuSize(frameType, pStreamContext->m_streamType); - } - - size -= auSize ; - if(size != 0) - { - filePos = -((M4OSA_FilePosition)size); - pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, - M4OSA_kFileSeekCurrent, &filePos); - } - - pAu->size = auSize ; - - /* even when frameType == 15 (no data frame), ARM core decoder outputs full PCM buffer */ - /*if(frameType == 15 ) - { - pAu->CTS += 0; - }*/ - /*else*/ - { - pAu->CTS += M4AMRR_FRAME_LENGTH ; - } - - - pAu->DTS = pAu->CTS ; - pAu->attribute = M4SYS_kFragAttrOk; - - pAu->stream = pStreamContext->m_pStreamHandler; - pAu->dataAddress = pStreamContext->m_pdataAddress ; - - if(frameHeader & 0x80) - { - return M4WAR_NO_MORE_AU; - } - - /* Change the state to implement NextAu->freeAu->NextAu FSM */ - pStreamContext->m_status = M4AMRR_kReading_nextAU ; - - return M4NO_ERROR ; -} - -/*********************************************************/ -M4OSA_ERR M4AMRR_freeAU(M4OSA_Context Context, M4SYS_StreamID StreamID, M4SYS_AccessUnit* pAu) -/*********************************************************/ -{ - M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; - M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pAu),M4ERR_PARAMETER,"Access Unit . M4OSA_NULL"); - M4OSA_DEBUG_IF2((pStreamContext->m_contextId != M4AMRR_CONTEXTID),M4ERR_BAD_CONTEXT, - "Bad Context"); - M4OSA_DEBUG_IF1(( pStreamContext->m_status != M4AMRR_kReading_nextAU), M4ERR_STATE, - "Invalid State"); - - if (( StreamID != 1 ) && ( StreamID != 0)) - { - return M4ERR_BAD_STREAM_ID; - } - - /* Change the state to Reading so as to allow access to next AU */ - pStreamContext->m_status = M4AMRR_kReading ; - - return M4NO_ERROR ; -} - -/*********************************************************/ -M4OSA_ERR M4AMRR_seek(M4OSA_Context Context, M4SYS_StreamID* pStreamID, M4OSA_Time time, - M4SYS_SeekAccessMode seekMode, M4OSA_Time* pObtainCTS) -/*********************************************************/ -{ - M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; - M4OSA_UInt32 count, prevAU, nextAU ; - M4OSA_UInt32 size ; - M4OSA_UInt32 auSize ; - M4OSA_UInt32 position, partSeekTime; - M4OSA_UInt32 auCount = 0, skipAuCount = 0 ; - M4OSA_Char frameHeader ; - M4OSA_Char frameType ; - M4OSA_FilePosition filePos; - M4OSA_Double time_double; - - /*Make explicit time cast, but take care that timescale is not used !!!*/ - M4OSA_TIME_TO_MS(time_double, time, 1000); - - *pObtainCTS = 0; - - M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); - M4OSA_DEBUG_IF2((pStreamContext->m_contextId != M4AMRR_CONTEXTID),M4ERR_BAD_CONTEXT, - "Bad Context"); - M4OSA_DEBUG_IF1(( pStreamContext->m_status != M4AMRR_kReading) && \ - ( pStreamContext->m_status != M4AMRR_kOpened), M4ERR_STATE, "Invalid State"); - M4OSA_DEBUG_IF1((time_double < 0),M4ERR_PARAMETER,"negative time"); - - /* Coming to seek for the first time, need to build the seekIndex Table */ - if(M4OSA_NULL == pStreamContext->m_pSeekIndex) - { - M4OSA_Double duration_double; - - count = 0 ; - pStreamContext->m_pSeekIndex = - (M4OSA_UInt32*)M4OSA_32bitAlignedMalloc(M4AMRR_NUM_SEEK_ENTRIES * sizeof(M4OSA_UInt32), - M4AMR_READER, (M4OSA_Char *)("pStreamContext->m_pSeekIndex")); - - if(M4OSA_NULL == pStreamContext->m_pSeekIndex) - { - M4OSA_DEBUG_IF3((M4OSA_NULL == pStreamContext->m_pSeekIndex),M4ERR_ALLOC, - "Mem Alloc Failed - SeekIndex"); - return M4ERR_ALLOC ; - } - - /* point to the first AU */ - if( pStreamContext->m_streamType == M4SYS_kAMR ) - { - filePos = 6; - } - else /*if ( pStreamContext->m_streamType == M4SYS_kAMR_WB )*/ - { - filePos = 9; - } - - pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, - M4OSA_kFileSeekBeginning, &filePos); - - /* Set the postion to begining of first AU */ - position = (pStreamContext->m_streamType != M4SYS_kAMR)?9:6; - - /*Make explicit time cast, but take care that timescale is not used !!!*/ - M4OSA_TIME_TO_MS(duration_double, pStreamContext->m_pStreamHandler->duration, 1000); - - /* Calculate the seek Interval duration based on total dutation */ - /* Interval = (duration / ENTRIES) in multiples of AU frame length */ - pStreamContext->m_seekInterval = - (M4OSA_UInt32)(duration_double / M4AMRR_NUM_SEEK_ENTRIES) ; - pStreamContext->m_seekInterval /= M4AMRR_FRAME_LENGTH ; - pStreamContext->m_seekInterval *= M4AMRR_FRAME_LENGTH ; - skipAuCount = pStreamContext->m_seekInterval / M4AMRR_FRAME_LENGTH ; - - pStreamContext->m_pSeekIndex[count++]=position; - while(count < M4AMRR_NUM_SEEK_ENTRIES ) - { - size = 1; - pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, - (M4OSA_MemAddr8)&frameHeader, &size); - if ( size == 0) - { - break ; - } - frameType = (frameHeader & 0x78) >> 3 ; - if(frameType != 15) - { - /**< bugfix Ronan Cousyn 05/04/2006: In the core reader AMR, the - * function M4AMRR_seek doesn't check the frameType */ - if (( pStreamContext->m_streamType == M4SYS_kAMR ) && ( frameType > 10 )) - { - return M4ERR_AMR_INVALID_FRAME_TYPE; - } - if (( pStreamContext->m_streamType == M4SYS_kAMR_WB ) && ( frameType > 9 )) - { - return M4ERR_AMR_INVALID_FRAME_TYPE; - } - auSize = M4AMRR_getAuSize(frameType, pStreamContext->m_streamType); - position += auSize ; - filePos = auSize-1; - pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, - M4OSA_kFileSeekCurrent, &filePos); - auCount++; - } - else - { - position ++; - } - /* Skip the number of AU's as per interval and store in the Index table */ - if ( (skipAuCount != 0) && !(auCount % skipAuCount)) - { - pStreamContext->m_pSeekIndex[count++] = position; - } - } - }/* End of Building the seek table */ - - /* Use the seek table to seek the required time in the stream */ - - /* If we are seeking the begining of the file point to first AU */ - if ( seekMode == M4SYS_kBeginning ) - { - if( pStreamContext->m_streamType == M4SYS_kAMR ) - { - filePos = 6; - } - else /*if ( pStreamContext->m_streamType == M4SYS_kAMR_WB )*/ - { - filePos = 9; - } - pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, - M4OSA_kFileSeekBeginning, &filePos ); - return M4NO_ERROR ; - } - - /* Get the Nearest Second */ - if (0 != pStreamContext->m_seekInterval) - { - position = (M4OSA_UInt32)(time_double / pStreamContext->m_seekInterval); - } - else - { - /*avoid division by 0*/ - position = 0; - } - - /* We have only 40 seek Index. */ - position=(position >= M4AMRR_NUM_SEEK_ENTRIES)?M4AMRR_NUM_SEEK_ENTRIES-1:position; - - /* SeekIndex will point to nearest Au, we need to search for the - required time form that position */ - partSeekTime = (M4OSA_UInt32)time_double - position * pStreamContext->m_seekInterval; - - position = pStreamContext->m_pSeekIndex[position]; - - if(!position) - { - return M4WAR_INVALID_TIME ; - } - - /* point the file pointer to nearest AU */ - filePos = position; - pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, M4OSA_kFileSeekBeginning, - &filePos ); - - if ( partSeekTime == 0) - { - *pObtainCTS = time; - return M4NO_ERROR; - } - - *pObtainCTS = (M4OSA_Time)(time_double - (M4OSA_Double)partSeekTime); - - switch(seekMode) - { - /* Get the AU before the target time */ - case M4SYS_kPreviousRAP: - case M4SYS_kNoRAPprevious: - position = partSeekTime / M4AMRR_FRAME_LENGTH ; - if ( !(partSeekTime % M4AMRR_FRAME_LENGTH) ) - { - position -- ; - } - break; - /* Get the Closest AU following the target time */ - case M4SYS_kNextRAP: - case M4SYS_kNoRAPnext: - position = (partSeekTime + M4AMRR_FRAME_LENGTH )/ M4AMRR_FRAME_LENGTH ; - break; - /* Get the closest AU to target time */ - case M4SYS_kClosestRAP: - case M4SYS_kNoRAPclosest: - prevAU = partSeekTime-(partSeekTime/M4AMRR_FRAME_LENGTH)*M4AMRR_FRAME_LENGTH; - nextAU = - ((partSeekTime+M4AMRR_FRAME_LENGTH)/M4AMRR_FRAME_LENGTH)*M4AMRR_FRAME_LENGTH -\ - partSeekTime ; - if(prevAU < nextAU) - { - position = partSeekTime / M4AMRR_FRAME_LENGTH ; - } - else - { - position = (partSeekTime + M4AMRR_FRAME_LENGTH )/ M4AMRR_FRAME_LENGTH ; - } - break; - case M4SYS_kBeginning: - break; - } - - count = 0 ; - /* Skip the Access unit in the stream to skip the part seek time, - to reach the required target time */ - while(count < position ) - { - size = 1; - pStreamContext->m_pOsaFilePtrFct->readData(pStreamContext->m_pAMRFile, - (M4OSA_MemAddr8)&frameHeader, &size); - if ( size == 0) - { - /* If the target time is invalid, point to begining and return */ - *pObtainCTS = 0; - filePos = pStreamContext->m_pSeekIndex[0]; - pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, - M4OSA_kFileSeekBeginning, &filePos); - return M4WAR_INVALID_TIME ; - } - *pObtainCTS += M4AMRR_FRAME_LENGTH; /*Should use M4OSA_INT64_ADD !!*/ - count++; - frameType = (frameHeader & 0x78) >> 3 ; - if(frameType == 15) - { - auSize = 1 ; - } - else - { - auSize = M4AMRR_getAuSize(frameType, pStreamContext->m_streamType); - } - - filePos = auSize-1; - pStreamContext->m_pOsaFilePtrFct->seek(pStreamContext->m_pAMRFile, - M4OSA_kFileSeekCurrent, &filePos); - } - - return M4NO_ERROR; -} - -/*********************************************************/ -M4OSA_ERR M4AMRR_closeRead(M4OSA_Context Context) -/*********************************************************/ -{ - M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; - M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); - - /* Close the AMR stream */ - pStreamContext->m_pOsaFilePtrFct->closeRead(pStreamContext->m_pAMRFile); - - pStreamContext->m_status=M4AMRR_kClosed ; - - /* Check if AU data Address is allocated memory and free it */ - if(M4OSA_NULL != pStreamContext->m_pdataAddress) - { - free(pStreamContext->m_pdataAddress); - } - - /* Check if the stream handler is allocated memory */ - if(M4OSA_NULL != pStreamContext->m_pStreamHandler) - { - free(pStreamContext->m_pStreamHandler); - } - - /* Seek table is created only when seek is used, so check if memory is allocated */ - if(M4OSA_NULL != pStreamContext->m_pSeekIndex) - { - free(pStreamContext->m_pSeekIndex); - } - - /* Free the context */ - free(pStreamContext); - - return M4NO_ERROR ; -} - -/*********************************************************/ -M4OSA_ERR M4AMRR_getState(M4OSA_Context Context, M4AMRR_State* pState, M4SYS_StreamID streamId) -/*********************************************************/ -{ - M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; - M4OSA_DEBUG_IF2((M4OSA_NULL == Context),M4ERR_PARAMETER,"Context M4OSA_NULL"); - M4OSA_DEBUG_IF2((pStreamContext->m_contextId != M4AMRR_CONTEXTID),M4ERR_BAD_CONTEXT, - "Bad Context"); - - if (( streamId != 1 ) && ( streamId != 0)) - { - return M4ERR_BAD_STREAM_ID; - } - - *pState = pStreamContext->m_status ; - - return M4NO_ERROR ; -} - - -/*********************************************************/ -M4OSA_ERR M4AMRR_getVersion (M4_VersionInfo *pVersion) -/*********************************************************/ -{ - M4OSA_TRACE1_1("M4AMRR_getVersion called with pVersion: 0x%x\n", pVersion); - M4OSA_DEBUG_IF1(((M4OSA_UInt32) pVersion == 0),M4ERR_PARAMETER, - "pVersion is NULL in M4AMRR_getVersion"); - - pVersion->m_major = M4AMRR_VERSION_MAJOR; - pVersion->m_minor = M4AMRR_VERSION_MINOR; - pVersion->m_revision = M4AMRR_VERSION_REVISION; - - return M4NO_ERROR; -} - -/*********************************************************/ -M4OSA_ERR M4AMRR_getmaxAUsize(M4OSA_Context Context, M4OSA_UInt32 *pMaxAuSize) -/*********************************************************/ -{ - M4_AMRR_Context* pStreamContext=(M4_AMRR_Context*)Context; - - /** - * Check input parameters */ - M4OSA_DEBUG_IF1((M4OSA_NULL == Context), M4ERR_PARAMETER, - "M4AMRR_getmaxAUsize: Context is M4OSA_NULL"); - M4OSA_DEBUG_IF1((M4OSA_NULL == pMaxAuSize),M4ERR_PARAMETER, - "M4AMRR_getmaxAUsize: pMaxAuSize is M4OSA_NULL"); - - *pMaxAuSize = pStreamContext->m_maxAuSize; - - return M4NO_ERROR; -} - diff --git a/libvideoeditor/vss/src/M4ChannelConverter.c b/libvideoeditor/vss/src/M4ChannelConverter.c deleted file mode 100755 index fca5550..0000000 --- a/libvideoeditor/vss/src/M4ChannelConverter.c +++ /dev/null @@ -1,54 +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 M4ChannelCoverter.c - * @brief - * @note - ****************************************************************************** - */ - -void MonoTo2I_16( const short *src, - short *dst, - short n) -{ - short ii; - src += n-1; - dst += (n*2)-1; - - for (ii = n; ii != 0; ii--){ - *dst-- = *src; - *dst-- = *src--; - } - - return; -} - -void From2iToMono_16( const short *src, - short *dst, - short n) -{ - short ii; - long Temp; - for (ii = n; ii != 0; ii--){ - Temp = (long)*(src++); - Temp += (long)*(src++); - *(dst++) = (short)(Temp >>1); - } - - return; -} - diff --git a/libvideoeditor/vss/src/M4DECODER_Null.c b/libvideoeditor/vss/src/M4DECODER_Null.c deleted file mode 100755 index ce260e5..0000000 --- a/libvideoeditor/vss/src/M4DECODER_Null.c +++ /dev/null @@ -1,436 +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 M4DECODER_Null.c
- * @brief Implementation of the Null decoder public interface
- * @note This file implements a "null" video decoder, i.e. a decoder
- * that does nothing
-*************************************************************************
-*/
-#include "NXPSW_CompilerSwitches.h"
-
-#include "M4OSA_Types.h"
-#include "M4OSA_Debug.h"
-#include "M4TOOL_VersionInfo.h"
-#include "M4DA_Types.h"
-#include "M4DECODER_Common.h"
-#include "M4DECODER_Null.h"
-
-/**
- ************************************************************************
- * NULL Video Decoder version information
- ************************************************************************
-*/
-/* CHANGE_VERSION_HERE */
-#define M4DECODER_NULL_MAJOR 1
-#define M4DECODER_NULL_MINOR 0
-#define M4DECODER_NULL_REVISION 0
-
-/**
- ************************************************************************
- * structure M4_VideoHandler_Context
- * @brief Defines the internal context of a video decoder instance
- * @note The context is allocated and freed by the video decoder
- ************************************************************************
-*/
-typedef struct {
- void* m_pLibrary; // Core library identifier
- M4OSA_Int32 m_DecoderId; // Core decoder identifier
- M4OSA_Int32 m_RendererId; // Core renderer identifier
- M4_VideoStreamHandler* m_pVideoStreamhandler; // Video stream description
- M4_AccessUnit* m_pNextAccessUnitToDecode; // Access unit used to
- // read and decode one frame
- void* m_pUserData; // Pointer to any user data
- M4READER_DataInterface* m_pReader; // Reader data interface
- M4OSA_Bool m_bDoRendering; // Decides if render required
- M4OSA_Int32 m_structSize; // Size of the structure
-
- M4DECODER_OutputFilter* m_pVideoFilter; // Color conversion filter
- M4VIFI_ImagePlane *pDecYuvData; // Pointer to Yuv data plane
- M4VIFI_ImagePlane *pDecYuvWithEffect; // Pointer to Yuv plane with color effect
- M4OSA_Bool bYuvWithEffectSet; // Original Yuv data OR Yuv with color effect
-
-} M4_VideoHandler_Context;
-
-/***********************************************************************/
-/************** M4DECODER_VideoInterface implementation ****************/
-/***********************************************************************/
-
-/**
- ************************************************************************
- * @brief Creates an instance of the decoder
- * @note Allocates the context
- *
- * @param pContext: (OUT) Context of the decoder
- * @param pStreamHandler: (IN) Pointer to a video stream description
- * @param pSrcInterface: (IN) Pointer to the M4READER_DataInterface
- * structure that must be used by the
- * decoder to read data from the stream
- * @param pAccessUnit (IN) Pointer to an access unit
- * (allocated by the caller) where decoded data
- * are stored
- *
- * @return M4NO_ERROR There is no error
- * @return M4ERR_STATE State automaton is not applied
- * @return M4ERR_ALLOC A memory allocation has failed
- * @return M4ERR_PARAMETER At least one input parameter is not proper
- ************************************************************************
-*/
-M4OSA_ERR M4DECODER_NULL_create(M4OSA_Context *pContext,
- M4_StreamHandler *pStreamHandler,
- M4READER_GlobalInterface *pReaderGlobalInterface, - M4READER_DataInterface *pReaderDataInterface,
- M4_AccessUnit* pAccessUnit,
- M4OSA_Void* pUserData) {
-
- M4_VideoHandler_Context* pStreamContext = M4OSA_NULL;
-
- *pContext = M4OSA_NULL;
- pStreamContext = (M4_VideoHandler_Context*)M4OSA_32bitAlignedMalloc (
- sizeof(M4_VideoHandler_Context), M4DECODER_MPEG4,
- (M4OSA_Char *)"M4_VideoHandler_Context");
- if (pStreamContext == 0) {
- return M4ERR_ALLOC;
- }
-
- pStreamContext->m_structSize = sizeof(M4_VideoHandler_Context);
- pStreamContext->m_pNextAccessUnitToDecode = M4OSA_NULL;
- pStreamContext->m_pLibrary = M4OSA_NULL;
- pStreamContext->m_pVideoStreamhandler = M4OSA_NULL;
- pStreamContext->m_DecoderId = -1;
- pStreamContext->m_RendererId = -1;
-
- pStreamContext->m_pUserData = M4OSA_NULL;
- pStreamContext->m_bDoRendering = M4OSA_TRUE;
- pStreamContext->m_pVideoFilter = M4OSA_NULL;
- pStreamContext->bYuvWithEffectSet = M4OSA_FALSE;
-
- *pContext=pStreamContext;
- return M4NO_ERROR;
-}
-
-/**
- ************************************************************************
- * @brief Destroy the instance of the decoder
- * @note After this call the context is invalid
- *
- * @param context: (IN) Context of the decoder
- *
- * @return M4NO_ERROR There is no error
- * @return M4ERR_PARAMETER The context is invalid
- ************************************************************************
-*/
-M4OSA_ERR M4DECODER_NULL_destroy(M4OSA_Context pContext) {
-
- M4_VideoHandler_Context* pStreamContext = (M4_VideoHandler_Context*)pContext;
-
- M4OSA_DEBUG_IF1((M4OSA_NULL == pStreamContext),
- M4ERR_PARAMETER, "M4DECODER_NULL_destroy: invalid context pointer");
-
- free(pStreamContext);
-
- return M4NO_ERROR;
-}
-
-/**
- ************************************************************************
- * @brief Get an option value from the decoder
- * @note This function allows the caller to retrieve a property value:
- *
- * @param context: (IN) Context of the decoder
- * @param optionId: (IN) Indicates the option to get
- * @param pValue: (IN/OUT) Pointer to structure or value where
- * option is stored
- *
- * @return M4NO_ERROR There is no error
- * @return M4ERR_PARAMETER The context is invalid (in DEBUG only)
- * @return M4ERR_BAD_OPTION_ID When the option ID is not a valid one
- * @return M4ERR_STATE State automaton is not applied
- * @return M4ERR_NOT_IMPLEMENTED Function not implemented
- ************************************************************************
-*/
-M4OSA_ERR M4DECODER_NULL_getOption(M4OSA_Context context,
- M4OSA_OptionID optionId,
- M4OSA_DataOption pValue) {
-
- return M4ERR_NOT_IMPLEMENTED;
-}
-
-/**
- ************************************************************************
- * @brief Set an option value of the decoder
- * @note Allows the caller to set a property value:
- *
- * @param context: (IN) Context of the decoder
- * @param optionId: (IN) Identifier indicating the option to set
- * @param pValue: (IN) Pointer to structure or value
- * where option is stored
- *
- * @return M4NO_ERROR There is no error
- * @return M4ERR_BAD_OPTION_ID The option ID is not a valid one
- * @return M4ERR_STATE State automaton is not applied
- * @return M4ERR_PARAMETER The option parameter is invalid
- ************************************************************************
-*/
-M4OSA_ERR M4DECODER_NULL_setOption(M4OSA_Context context,
- M4OSA_OptionID optionId,
- M4OSA_DataOption pValue) {
-
- M4DECODER_OutputFilter *pFilterOption;
-
- M4_VideoHandler_Context *pStreamContext =
- (M4_VideoHandler_Context*)context;
-
- M4OSA_ERR err = M4NO_ERROR;
- M4OSA_UInt32 height = 0;
- M4OSA_UInt8 *p_src,*p_des;
- M4VIFI_ImagePlane* pTempDecYuvData = M4OSA_NULL;
-
- switch (optionId) {
- case M4DECODER_kOptionID_DecYuvData:
- pStreamContext->pDecYuvData = (M4VIFI_ImagePlane *)pValue;
- break;
-
- case M4DECODER_kOptionID_YuvWithEffectContiguous:
- pStreamContext->pDecYuvWithEffect = (M4VIFI_ImagePlane *)pValue;
- break;
-
- case M4DECODER_kOptionID_EnableYuvWithEffect:
- pStreamContext->bYuvWithEffectSet = (M4OSA_Bool)(intptr_t)pValue;
- break;
-
- case M4DECODER_kOptionID_YuvWithEffectNonContiguous:
- pTempDecYuvData = (M4VIFI_ImagePlane *)pValue;
-
- p_des = pStreamContext->pDecYuvWithEffect[0].pac_data +
- pStreamContext->pDecYuvWithEffect[0].u_topleft;
- p_src = pTempDecYuvData[0].pac_data +
- pTempDecYuvData[0].u_topleft;
-
- for (height = 0; height<pStreamContext->pDecYuvWithEffect[0].u_height;
- height++) {
- memcpy((void *)p_des, (void *)p_src,
- pStreamContext->pDecYuvWithEffect[0].u_width);
-
- p_des += pStreamContext->pDecYuvWithEffect[0].u_stride;
- p_src += pTempDecYuvData[0].u_stride;
- }
-
- p_des = pStreamContext->pDecYuvWithEffect[1].pac_data +
- pStreamContext->pDecYuvWithEffect[1].u_topleft;
- p_src = pTempDecYuvData[1].pac_data +
- pTempDecYuvData[1].u_topleft;
-
- for (height = 0; height<pStreamContext->pDecYuvWithEffect[1].u_height;
- height++) {
- memcpy((void *)p_des, (void *)p_src,
- pStreamContext->pDecYuvWithEffect[1].u_width);
-
- p_des += pStreamContext->pDecYuvWithEffect[1].u_stride;
- p_src += pTempDecYuvData[1].u_stride;
- }
-
- p_des = pStreamContext->pDecYuvWithEffect[2].pac_data +
- pStreamContext->pDecYuvWithEffect[2].u_topleft;
- p_src = pTempDecYuvData[2].pac_data +
- pTempDecYuvData[2].u_topleft;
-
- for (height = 0; height<pStreamContext->pDecYuvWithEffect[2].u_height;
- height++) {
- memcpy((void *)p_des, (void *)p_src,
- pStreamContext->pDecYuvWithEffect[2].u_width);
-
- p_des += pStreamContext->pDecYuvWithEffect[2].u_stride;
- p_src += pTempDecYuvData[2].u_stride;
- }
- break;
-
- case M4DECODER_kOptionID_OutputFilter:
- pFilterOption = (M4DECODER_OutputFilter*)pValue;
- break;
-
- case M4DECODER_kOptionID_DeblockingFilter:
- err = M4ERR_BAD_OPTION_ID;
- break;
-
- default:
- err = M4ERR_BAD_OPTION_ID;
- break;
- }
- return err;
-}
-
-/**
- ************************************************************************
- * @brief Decode video Access Units up to a target time
- * @note Parse and decode the video until it can output a decoded image
- * for which the composition time is equal or greater to the
- * passed targeted time.
- * The data are read from the reader data interface passed to
- * M4DECODER_MPEG4_create.
- *
- * @param context: (IN) Context of the decoder
- * @param pTime: (IN/OUT) IN: Time to decode up to (in msec)
- * OUT:Time of the last decoded frame (in msec)
- * @param bJump: (IN) 0 if no jump occured just before this call
- * 1 if a a jump has just been made
- * @return M4NO_ERROR there is no error
- * @return M4ERR_PARAMETER at least one parameter is not properly set
- * @return M4WAR_NO_MORE_AU there is no more access unit to decode (EOS)
- ************************************************************************
-*/
-M4OSA_ERR M4DECODER_NULL_decode(M4OSA_Context context,
- M4_MediaTime* pTime, M4OSA_Bool bJump, - M4OSA_UInt32 tolerance) { -
- // Do nothing; input time stamp itself returned
- return M4NO_ERROR;
-}
-
-/**
- ************************************************************************
- * @brief Renders the video at the specified time.
- * @note
- * @param context: (IN) Context of the decoder
- * @param pTime: (IN/OUT) IN: Time to render to (in msecs)
- * OUT:Time of the rendered frame (in ms)
- * @param pOutputPlane:(OUT) Output plane filled with decoded data
- * @param bForceRender:(IN) 1 if the image must be rendered even it
- * has been rendered already
- * 0 if not
- *
- * @return M4NO_ERROR There is no error
- * @return M4ERR_PARAMETER At least one parameter is not properly set
- * @return M4ERR_STATE State automaton is not applied
- * @return M4ERR_ALLOC There is no more available memory
- * @return M4WAR_VIDEORENDERER_NO_NEW_FRAME If the frame has already been rendered
- ************************************************************************
-*/
-M4OSA_ERR M4DECODER_NULL_render(M4OSA_Context context, M4_MediaTime* pTime,
- M4VIFI_ImagePlane* pOutputPlane,
- M4OSA_Bool bForceRender) {
-
- M4OSA_ERR err = M4NO_ERROR;
- M4OSA_UInt32 height;
- M4OSA_UInt8 *p_src,*p_des;
- M4_VideoHandler_Context* pStreamContext =
- (M4_VideoHandler_Context*)context;
-
- if (pStreamContext->bYuvWithEffectSet == M4OSA_TRUE) {
-
- p_des = pOutputPlane[0].pac_data + pOutputPlane[0].u_topleft;
- p_src = pStreamContext->pDecYuvWithEffect[0].pac_data +
- pStreamContext->pDecYuvWithEffect[0].u_topleft;
-
- for (height = 0; height<pOutputPlane[0].u_height; height++) {
- memcpy((void *)p_des, (void *)p_src, pOutputPlane[0].u_width);
- p_des += pOutputPlane[0].u_stride;
- p_src += pStreamContext->pDecYuvWithEffect[0].u_stride;
- }
-
- p_des = pOutputPlane[1].pac_data + pOutputPlane[1].u_topleft;
- p_src = pStreamContext->pDecYuvWithEffect[1].pac_data +
- pStreamContext->pDecYuvWithEffect[1].u_topleft;
-
- for (height = 0; height<pOutputPlane[1].u_height; height++) {
- memcpy((void *)p_des, (void *)p_src, pOutputPlane[1].u_width);
- p_des += pOutputPlane[1].u_stride;
- p_src += pStreamContext->pDecYuvWithEffect[1].u_stride;
- }
-
- p_des = pOutputPlane[2].pac_data + pOutputPlane[2].u_topleft;
- p_src = pStreamContext->pDecYuvWithEffect[2].pac_data +
- pStreamContext->pDecYuvWithEffect[2].u_topleft;
-
- for (height = 0; height<pOutputPlane[2].u_height; height++) {
- memcpy((void *)p_des, (void *)p_src, pOutputPlane[2].u_width);
- p_des += pOutputPlane[2].u_stride;
- p_src += pStreamContext->pDecYuvWithEffect[2].u_stride;
- }
- } else {
-
- p_des = pOutputPlane[0].pac_data + pOutputPlane[0].u_topleft;
- p_src = pStreamContext->pDecYuvData[0].pac_data +
- pStreamContext->pDecYuvData[0].u_topleft;
-
- for (height = 0; height<pOutputPlane[0].u_height; height++) {
- memcpy((void *)p_des, (void *)p_src, pOutputPlane[0].u_width);
- p_des += pOutputPlane[0].u_stride;
- p_src += pStreamContext->pDecYuvData[0].u_stride;
- }
-
- p_des = pOutputPlane[1].pac_data + pOutputPlane[1].u_topleft;
- p_src = pStreamContext->pDecYuvData[1].pac_data +
- pStreamContext->pDecYuvData[1].u_topleft;
-
- for (height = 0; height<pOutputPlane[1].u_height; height++) {
- memcpy((void *)p_des, (void *)p_src, pOutputPlane[1].u_width);
- p_des += pOutputPlane[1].u_stride;
- p_src += pStreamContext->pDecYuvData[1].u_stride;
- }
-
- p_des = pOutputPlane[2].pac_data + pOutputPlane[2].u_topleft;
- p_src = pStreamContext->pDecYuvData[2].pac_data +
- pStreamContext->pDecYuvData[2].u_topleft;
-
- for (height = 0; height<pOutputPlane[2].u_height; height++) {
- memcpy((void *)p_des,(void *)p_src,pOutputPlane[2].u_width);
- p_des += pOutputPlane[2].u_stride;
- p_src += pStreamContext->pDecYuvData[2].u_stride;
- }
- }
- return err;
-}
-
-/**
- ************************************************************************
- * @brief Retrieves the interface implemented by the decoder
- * @param pDecoderType : Pointer to a M4DECODER_VideoType
- * (allocated by the caller)
- * that will be filled with the decoder type
- * @param pDecoderInterface : Address of a pointer that will be set to
- * the interface implemented by this decoder.
- * The interface is a structure allocated by
- * this function and must be freed by the caller.
- *
- * @returns : M4NO_ERROR if OK
- * M4ERR_ALLOC if allocation failed
- ************************************************************************
-*/
-M4OSA_ERR M4DECODER_NULL_getInterface (M4DECODER_VideoType *pDecoderType,
- M4DECODER_VideoInterface **pDecoderInterface) {
-
- *pDecoderInterface =
- (M4DECODER_VideoInterface*)M4OSA_32bitAlignedMalloc(
- sizeof(M4DECODER_VideoInterface),
- M4DECODER_MPEG4, (M4OSA_Char *)"M4DECODER_VideoInterface");
-
- if (M4OSA_NULL == *pDecoderInterface) {
- return M4ERR_ALLOC;
- }
-
- *pDecoderType = M4DECODER_kVideoTypeYUV420P;
-
- (*pDecoderInterface)->m_pFctCreate = M4DECODER_NULL_create;
- (*pDecoderInterface)->m_pFctDestroy = M4DECODER_NULL_destroy;
- (*pDecoderInterface)->m_pFctGetOption = M4DECODER_NULL_getOption;
- (*pDecoderInterface)->m_pFctSetOption = M4DECODER_NULL_setOption;
- (*pDecoderInterface)->m_pFctDecode = M4DECODER_NULL_decode;
- (*pDecoderInterface)->m_pFctRender = M4DECODER_NULL_render;
-
- return M4NO_ERROR;
-}
diff --git a/libvideoeditor/vss/src/M4PCMR_CoreReader.c b/libvideoeditor/vss/src/M4PCMR_CoreReader.c deleted file mode 100755 index 19f07dd..0000000 --- a/libvideoeditor/vss/src/M4PCMR_CoreReader.c +++ /dev/null @@ -1,716 +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 M4PCM_PCMReader.c - * @brief PCM reader implementation - * @note This file implements functions of the PCM reader - ************************************************************************ - */ -#include "M4OSA_CharStar.h" -#include "M4PCMR_CoreReader.h" -#include "M4OSA_Debug.h" -#include "M4OSA_CharStar.h" -/** - ****************************************************************************** - * PCM reader version numbers - ****************************************************************************** - */ -/* CHANGE_VERSION_HERE */ -#define M4PCMR_VERSION_MAJOR 1 -#define M4PCMR_VERSION_MINOR 0 -#define M4PCMR_VERSION_REVISION 0 - -/** - ************************************************************************ - * M4OSA_ERR M4PCMR_openRead(M4OSA_Context* pContext, M4OSA_Void* pUrl, - * M4OSA_FileReaderPointer* pFileFunction) - * @brief This function opens a PCM file - * @note This function : - * - opens a PCM file - * - initializes PCM context, - * - verifies PCM file format - * - Fill decoder config structure - * - Changes state of the reader in 'Opening' - * @param pContext: (OUT) Pointer on the PCM Reader context - * @param pUrl: (IN) Name of the PCM file - * @param pFileFunctions: (IN) Pointer on the file access functions - * @return M4NO_ERROR there is no error during the opening - * @return M4ERR_PARAMETER pContext and/or pUrl and/or pFileFunction is NULL - * @return M4ERR_ALLOC there is no more memory available - * @return M4ERR_FILE_NOT_FOUND the file cannot be found - * @return M4PCMC_ERR_PCM_NOT_COMPLIANT the file does not seem to be compliant, no RIFF, - * or lack of any mandatory chunk. - * @return M4PCMC_ERR_PCM_NOT_SUPPORTED the PCM format of this file is not supported by the - * reader - * @return Any M4OSA_FILE errors see OSAL File specification for detailed errors - ************************************************************************ - */ -M4OSA_ERR M4PCMR_openRead(M4OSA_Context* pContext, M4OSA_Void* pUrl, - M4OSA_FileReadPointer* pFileFunction) -{ - M4OSA_ERR err; - M4PCMR_Context *context; - M4OSA_Char* pTempURL; - M4OSA_Char value[6]; - - /* Check parameters */ - if((M4OSA_NULL == pContext)|| (M4OSA_NULL == pUrl) ||(M4OSA_NULL == pFileFunction)) - { - return M4ERR_PARAMETER; - } - - /* Allocates the context */ - context = M4OSA_NULL; - context = (M4PCMR_Context *)M4OSA_32bitAlignedMalloc(sizeof(M4PCMR_Context), M4WAV_READER, - (M4OSA_Char *)"M4PCMR_openRead"); - if (M4OSA_NULL == context) - { - return M4ERR_ALLOC; - } - *pContext = (M4OSA_Context)context; - - /* Initialize the context */ - context->m_offset = 0; - - context->m_state = M4PCMR_kInit; - context->m_microState = M4PCMR_kInit; - context->m_pFileReadFunc = M4OSA_NULL; - context->m_fileContext = M4OSA_NULL; - context->m_pAuBuffer = M4OSA_NULL; - context->m_pDecoderSpecInfo = M4OSA_NULL; - - /* Set sample frequency */ - pTempURL = (M4OSA_Char*)pUrl + (strlen((const char *)pUrl)-11); - M4OSA_chrNCopy(value, pTempURL, 5); - M4OSA_chrGetUInt32(pTempURL, &(context->m_decoderConfig.SampleFrequency), - M4OSA_NULL, M4OSA_kchrDec); - - /* Set number of channels */ - pTempURL += 6; - M4OSA_chrNCopy(value, pTempURL, 1); - M4OSA_chrGetUInt16(pTempURL, &(context->m_decoderConfig.nbChannels), - M4OSA_NULL, M4OSA_kchrDec); - - M4OSA_chrNCopy(pUrl,pUrl, (strlen((const char *)pUrl)-12)); - /* Open the file */ - context->m_fileContext = M4OSA_NULL; - err = pFileFunction->openRead(&(context->m_fileContext), pUrl, M4OSA_kFileRead); - if(M4NO_ERROR != err) - { - return err; - } - context->m_decoderConfig.BitsPerSample = 16; - context->m_decoderConfig.AvgBytesPerSec = context->m_decoderConfig.SampleFrequency * 2 \ - * context->m_decoderConfig.nbChannels; - err = pFileFunction->getOption(context->m_fileContext, M4OSA_kFileReadGetFileSize, - (M4OSA_DataOption*)&(context->m_decoderConfig.DataLength)); - if(M4NO_ERROR != err) - { - return err; - } - context->m_blockSize = 2048 * context->m_decoderConfig.nbChannels; // Raw PCM. Hence, get a - // chunk of data - - if(context->m_decoderConfig.SampleFrequency == 8000) - { - /* AMR case, no pb */ - context->m_blockSize = context->m_decoderConfig.nbChannels *\ - (context->m_decoderConfig.SampleFrequency / 50) * \ - (context->m_decoderConfig.BitsPerSample / 8); - } - if(context->m_decoderConfig.SampleFrequency == 16000) - { - /* AAC case, we can't read only 20 ms blocks */ - context->m_blockSize = 2048 * context->m_decoderConfig.nbChannels; - } - context->m_dataStartOffset = 0; - context->m_pFileReadFunc = pFileFunction; - - context->m_pAuBuffer = (M4OSA_MemAddr32)M4OSA_32bitAlignedMalloc(context->m_blockSize, M4WAV_READER, - (M4OSA_Char *)"Core PCM reader Access Unit"); - if (M4OSA_NULL == context->m_pAuBuffer) - { - err = M4ERR_ALLOC; - goto cleanup; - } - - /* Change state */ - context->m_state = M4PCMR_kOpening; - - return M4NO_ERROR; - -cleanup: - - /* Close the file */ - if(context->m_pFileReadFunc != M4OSA_NULL) - context->m_pFileReadFunc->closeRead(context->m_fileContext); - - /* Free internal context */ - free(context); - *pContext = M4OSA_NULL; - - return err; -} - -/** - ************************************************************************ - * M4OSA_ERR M4PCMR_getNextStream(M4OSA_Context context, M4SYS_StreamDescription* pStreamDesc) - * @brief This function get the (unique) stream of a PCM file - * @note This function : - * - Allocates and fills the decoder specific info structure - * - Fills decoder specific infos structure - * - Fills pStreamDesc structure allocated by the caller - * @param context: (IN/OUT) PCM Reader context - * @param pStreamDesc: (IN) Stream Description context - * @return M4NO_ERROR there is no error - * @return M4ERR_PARAMETER at least one parameter is NULL - * @return M4ERR_ALLOC there is no more memory available - * @return M4ERR_STATE this function cannot be called now - * @return Any M4OSA_FILE errors see OSAL File specification for detailed errors - ************************************************************************ - */ -M4OSA_ERR M4PCMR_getNextStream(M4OSA_Context context, M4SYS_StreamDescription* pStreamDesc) -{ - M4PCMR_Context *c = (M4PCMR_Context *)context; - - /* Check parameters */ - if((M4OSA_NULL == context)|| (M4OSA_NULL == pStreamDesc)) - { - return M4ERR_PARAMETER; - } - - if (c->m_state == M4PCMR_kOpening_streamRetrieved) - { - return M4WAR_NO_MORE_STREAM; - } - /* Check Reader's m_state */ - if(c->m_state != M4PCMR_kOpening) - { - return M4ERR_STATE; - } - - /* Only one stream is contained in PCM file */ - pStreamDesc->streamID = 1; - /* Not used */ - pStreamDesc->profileLevel = 0; - pStreamDesc->decoderSpecificInfoSize = sizeof(M4PCMC_DecoderSpecificInfo); - - /* Allocates decoder specific info structure */ - pStreamDesc->decoderSpecificInfo = M4OSA_NULL; - pStreamDesc->decoderSpecificInfo = - (M4OSA_MemAddr32)M4OSA_32bitAlignedMalloc( sizeof(M4PCMC_DecoderSpecificInfo), M4WAV_READER, - (M4OSA_Char *)"M4PCMR_getNextStream"); - if(pStreamDesc->decoderSpecificInfo == M4OSA_NULL) - { - return M4ERR_ALLOC; - } - /* Fill decoderSpecificInfo structure, with decoder config structure filled in 'openread' - function */ - memcpy((void *)pStreamDesc->decoderSpecificInfo, - (void *)&c->m_decoderConfig, sizeof(M4PCMC_DecoderSpecificInfo)); - - /* Fill other fields of pStreamDesc structure */ - pStreamDesc->timeScale = 1000; - pStreamDesc->duration = (M4OSA_Time)(((M4OSA_Double)(c->m_decoderConfig.DataLength)\ - / (M4OSA_Double)(c->m_decoderConfig.AvgBytesPerSec))*pStreamDesc->timeScale); - pStreamDesc->averageBitrate = c->m_decoderConfig.AvgBytesPerSec * 8;/* in bits, multiply by 8*/ - pStreamDesc->maxBitrate = pStreamDesc->averageBitrate; /* PCM stream has constant bitrate */ - - /* Determines Stream type */ - switch(c->m_decoderConfig.BitsPerSample) - { - case 8: - switch(c->m_decoderConfig.nbChannels) - { - case 1: - pStreamDesc->streamType = M4SYS_kPCM_8bitsU; - break; -// case 2: -// pStreamDesc->streamType = M4SYS_kPCM_8bitsS; /* ??? 8bits stereo not - // defined ? */ -// break; - default: - pStreamDesc->streamType = M4SYS_kAudioUnknown; - } - break; - - case 16: - switch(c->m_decoderConfig.nbChannels) - { - case 1: - pStreamDesc->streamType = M4SYS_kPCM_16bitsU; - break; - case 2: - pStreamDesc->streamType = M4SYS_kPCM_16bitsS; - break; - default: - pStreamDesc->streamType = M4SYS_kAudioUnknown; - } - break; - - default: - pStreamDesc->streamType = M4SYS_kAudioUnknown; - } - - c->m_pDecoderSpecInfo = pStreamDesc->decoderSpecificInfo; - - c->m_state = M4PCMR_kOpening_streamRetrieved; - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4PCMR_startReading(M4OSA_Context context, M4SYS_StreamID* pStreamIDs) - * @brief This function starts reading the unique stream of a PCM file - * @note This function : - * - Verifies that the current reader's state allows to start reading a stream - * - Check that provided StreamId is correct (always true, only one stream...) - * In the player application, a StreamId table is initialized as follow: - * M4SYS_StreamID pStreamID[2]={1,0}; - * - Change state of the reader in 'Reading' - * @param context: (IN/OUT) PCM Reader context - * @param streamID: (IN) Stream selection - * @return M4NO_ERROR there is no error - * @return M4ERR_PARAMETER at least one parameter is NULL - * @return M4ERR_STATE this function cannot be called now - * @return M4ERR_BAD_STREAM_ID at least one of the streamID does not exist - * (should never happen if table pStreamID is correctly initialized as above) - ************************************************************************ - */ -M4OSA_ERR M4PCMR_startReading(M4OSA_Context context, M4SYS_StreamID* pStreamIDs) -{ - M4PCMR_Context *c = (M4PCMR_Context *)context; - - /* Check parameters */ - if((M4OSA_NULL == context) || (M4OSA_NULL == pStreamIDs)) - { - return M4ERR_PARAMETER; - } - - /* Check Reader's state */ - if(c->m_state != M4PCMR_kOpening_streamRetrieved) - { - return M4ERR_STATE; - } - - /* Check pStreamID and if they're OK, change reader's state */ - if(pStreamIDs[0] == 1 || pStreamIDs[0] == 0) - /* First and unique stream contained in PCM file */ - { - c->m_state = M4PCMR_kReading; - c->m_microState = M4PCMR_kReading; - } - else - { - return M4ERR_BAD_STREAM_ID; - } - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4PCMR_nextAU(M4OSA_Context context, M4SYS_StreamID streamID, M4SYS_AccessUnit* pAU) - * @brief This function reads the next AU contained in the PCM file - * @note This function : - * - Verifies that the current reader's state allows to read an AU - * - Allocates memory to store read AU - * - Read data from file and store them into previously allocated memory - * - Fill AU structure fileds (CTS...) - * - Change state of the reader in 'Reading' (not useful...) - * - Change Micro state 'Reading' in M4PCMR_kReading_nextAU - * (AU is read and can be deleted) - * - Check if the last AU has been read or if we're about to read it - * @param context: (IN/OUT) PCM Reader context - * @param streamID: (IN) Stream selection - * @param pAU: (IN/OUT) Acces Unit Structure - * @return M4NO_ERROR there is no error - * @return M4ERR_PARAMETER at least one parameter is NULL - * @return M4ERR_ALLOC there is no more memory available - * @return M4ERR_STATE this function cannot be called now - * @return M4M4WAR_NO_DATA_YET there is no enough data in the file to provide a new access unit. - * @return M4WAR_END_OF_STREAM There is no more access unit in the stream, - * or the sample number is bigger the maximum one. - ************************************************************************ - */ -M4OSA_ERR M4PCMR_nextAU(M4OSA_Context context, M4SYS_StreamID streamID, M4SYS_AccessUnit* pAU) -{ - M4PCMR_Context *c = (M4PCMR_Context *)context; - M4OSA_ERR err = M4NO_ERROR; - M4OSA_UInt32 size_read; - - /* Check parameters */ - if((M4OSA_NULL == context) || (M4OSA_NULL == pAU)) - { - return M4ERR_PARAMETER; - } - - /* Check Reader's state */ - if(c->m_state != M4PCMR_kReading && c->m_microState != M4PCMR_kReading) - { - return M4ERR_STATE; - } - - /* Allocates AU dataAdress */ - pAU->dataAddress = c->m_pAuBuffer; - size_read = c->m_blockSize; - - if((c->m_offset + size_read) >= c->m_decoderConfig.DataLength) - { - size_read = c->m_decoderConfig.DataLength - c->m_offset; - } - - /* Read data in file, and copy it to AU Structure */ - err = c->m_pFileReadFunc->readData(c->m_fileContext, (M4OSA_MemAddr8)pAU->dataAddress, - (M4OSA_UInt32 *)&size_read); - if(M4NO_ERROR != err) - { - return err; - } - - /* Calculates the new m_offset, used to determine whether we're at end of reading or not */ - c->m_offset = c->m_offset + size_read; - - /* Fill others parameters of AU structure */ - pAU->CTS = - (M4OSA_Time)(((M4OSA_Double)c->m_offset/(M4OSA_Double)c->m_decoderConfig.AvgBytesPerSec)\ - *1000); - pAU->DTS = pAU->CTS; - - pAU->attribute = 0; - pAU->frag = M4OSA_NULL; - pAU->nbFrag = 0; - pAU->stream = M4OSA_NULL; - pAU->size = size_read; - - /* Change states */ - c->m_state = M4PCMR_kReading; /* Not changed ... */ - c->m_microState = M4PCMR_kReading_nextAU; /* AU is read and can be deleted */ - - /* Check if there is another AU to read */ - /* ie: if decoded nb of bytes = nb of bytes to decode, - it means there is no more AU to decode */ - if(c->m_offset >= c->m_decoderConfig.DataLength) - { - return M4WAR_NO_MORE_AU; - } - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4PCMR_freeAU(M4OSA_Context context, M4SYS_StreamID streamID, M4SYS_AccessUnit* pAU) - * @brief This function frees the AU provided in parameter - * @note This function : - * - Verifies that the current reader's state allows to free an AU - * - Free dataAddress field of AU structure - * - Change state of the reader in 'Reading' (not useful...) - * - Change Micro state 'Reading' in M4PCMR_kReading (another AU can be read) - * @param context: (IN/OUT) PCM Reader context - * @param streamID: (IN) Stream selection - * @param pAU: (IN) Acces Unit Structure - * @return M4NO_ERROR there is no error - * @return M4ERR_PARAMETER at least one parameter is NULL - * @return M4ERR_STATE this function cannot be called now - ************************************************************************ - */ -M4OSA_ERR M4PCMR_freeAU(M4OSA_Context context, M4SYS_StreamID streamID, M4SYS_AccessUnit* pAU) -{ - M4PCMR_Context *c = (M4PCMR_Context *)context; - - /* Check parameters */ - if((M4OSA_NULL == context ) || (M4OSA_NULL == pAU)) - { - return M4ERR_PARAMETER; - } - - /* Check Reader's state */ - if(c->m_state != M4PCMR_kReading && c->m_microState != M4PCMR_kReading_nextAU) - { - return M4ERR_STATE; - } - - pAU->dataAddress = M4OSA_NULL; - - /* Change states */ - c->m_state = M4PCMR_kReading; /* Not changed ... */ - c->m_microState = M4PCMR_kReading; /* AU is deleted, another AU can be read */ - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4PCMR_seek(M4OSA_Context context, M4SYS_StreamID* pStreamID, - M4OSA_Time time, M4SYS_seekAccessMode seekAccessMode, - M4OSA_Time* pObtainCTS[]) - * @brief This function seeks into the PCM file at the provided time - * @note This function : - * - Verifies that the current reader's state allows to seek - * - Determines from provided time m_offset to seek in file - * - If m_offset is correct, seek in file - * - Update new m_offset in PCM reader context - * @param context: (IN/OUT) PCM Reader context - * @param pStreamID: (IN) Stream selection (not used, only 1 stream) - * @param time: (IN) Targeted time - * @param seekMode: (IN) Selects the seek access mode - * @param pObtainCTS[]: (OUT) Returned Time (not used) - * @return M4NO_ERROR there is no error - * @return M4ERR_PARAMETER at least one parameter is NULL - * @return M4ERR_ALLOC there is no more memory available - * @return M4ERR_STATE this function cannot be called now - * @return M4WAR_INVALID_TIME Specified time is not reachable - * @param M4ERR_NOT_IMPLEMENTED This seek mode is not implemented yet - ************************************************************************ - */ -M4OSA_ERR M4PCMR_seek(M4OSA_Context context, M4SYS_StreamID* pStreamID, M4OSA_Time time, - M4SYS_SeekAccessMode seekAccessMode, M4OSA_Time* pObtainCTS) -{ - M4PCMR_Context *c = (M4PCMR_Context *)context; - M4OSA_ERR err = M4NO_ERROR; - M4OSA_UInt32 offset; - M4OSA_UInt32 alignment; - M4OSA_UInt32 size_read; - - /* Check parameters */ - if((M4OSA_NULL == context) || (M4OSA_NULL == pStreamID)) - { - return M4ERR_PARAMETER; - } - - /* Check Reader's state */ - if(c->m_state != M4PCMR_kOpening_streamRetrieved && c->m_state != M4PCMR_kReading) - { - return M4ERR_STATE; - } - - switch(seekAccessMode) - { - case M4SYS_kBeginning: - /* Determine m_offset from time*/ - offset = - (M4OSA_UInt32)(time * ((M4OSA_Double)(c->m_decoderConfig.AvgBytesPerSec) / 1000)); - /** check the alignment on sample boundary */ - alignment = c->m_decoderConfig.nbChannels*c->m_decoderConfig.BitsPerSample/8; - if (offset%alignment != 0) - { - offset -= offset%alignment; - } - /*add the header offset*/ - offset += c->m_dataStartOffset; - /* If m_offset is over file size -> Invalid time */ - if (offset > (c->m_dataStartOffset + c->m_decoderConfig.DataLength)) - { - return M4WAR_INVALID_TIME; - } - else - { - /* Seek file */ - size_read = offset; - err = c->m_pFileReadFunc->seek(c->m_fileContext, M4OSA_kFileSeekBeginning, - (M4OSA_FilePosition *) &size_read); - if(M4NO_ERROR != err) - { - return err; - } - /* Update m_offset in M4PCMR_context */ - c->m_offset = offset - c->m_dataStartOffset; - } - break; - - default: - return M4ERR_NOT_IMPLEMENTED; - } - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4PCMR_closeRead(M4OSA_Context context) - * @brief This function closes PCM file, and frees context - * @note This function : - * - Verifies that the current reader's state allows close the PCM file - * - Closes the file - * - Free structures - * @param context: (IN/OUT) PCM Reader context - * @return M4NO_ERROR there is no error - * @return M4ERR_PARAMETER at least one parameter is NULL - * @return M4ERR_STATE this function cannot be called now - ************************************************************************ - */ -M4OSA_ERR M4PCMR_closeRead(M4OSA_Context context) -{ - M4PCMR_Context *c = (M4PCMR_Context *)context; - M4OSA_ERR err = M4NO_ERROR; - - /* Check parameters */ - if(M4OSA_NULL == context) - { - return M4ERR_PARAMETER; - } - - if(c->m_pDecoderSpecInfo != M4OSA_NULL) - { - free(c->m_pDecoderSpecInfo); - } - - /* Check Reader's state */ - if(c->m_state != M4PCMR_kReading) - { - return M4ERR_STATE; - } - else if(c->m_microState == M4PCMR_kReading_nextAU) - { - return M4ERR_STATE; - } - - if (M4OSA_NULL != c->m_pAuBuffer) - { - free(c->m_pAuBuffer); - } - - /* Close the file */ - if (M4OSA_NULL != c->m_pFileReadFunc) - { - err = c->m_pFileReadFunc->closeRead(c->m_fileContext); - } - - /* Free internal context */ - if (M4OSA_NULL != c) - { - free(c); - } - - return err; -} - -/** - ************************************************************************ - * M4OSA_ERR M4PCMR_getOption(M4OSA_Context context, M4PCMR_OptionID optionID, - * M4OSA_DataOption* pValue) - * @brief This function get option of the PCM Reader - * @note This function : - * - Verifies that the current reader's state allows to get an option - * - Return corresponding option value - * @param context: (IN/OUT) PCM Reader context - * @param optionID: (IN) ID of the option to get - * @param pValue: (OUT) Variable where the option value is returned - * @return M4NO_ERROR there is no error. - * @return M4ERR_PARAMETER at least one parameter is NULL. - * @return M4ERR_BAD_OPTION_ID the optionID is not a valid one. - * @return M4ERR_STATE this option is not available now. - * @return M4ERR_NOT_IMPLEMENTED this option is not implemented - ************************************************************************ - */ -M4OSA_ERR M4PCMR_getOption(M4OSA_Context context, M4PCMR_OptionID optionID, - M4OSA_DataOption* pValue) -{ - M4PCMR_Context *c =(M4PCMR_Context *)context; - - /* Check parameters */ - if(M4OSA_NULL == context) - { - return M4ERR_PARAMETER; - } - - /* Check reader's state */ - if((c->m_state != M4PCMR_kOpening) && (c->m_state != M4PCMR_kOpening_streamRetrieved)\ - && (c->m_state != M4PCMR_kReading)) - { - return M4ERR_STATE; - } - - /* Depend of the OptionID, the value to return is different */ - switch(optionID) - { - case M4PCMR_kPCMblockSize: - *pValue = &c->m_blockSize; - break; - - default: - return M4ERR_BAD_OPTION_ID; - } - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4PCMR_setOption(M4OSA_Context context, M4PCMR_OptionID optionID, - * M4OSA_DataOption Value) - * @brief This function set option of the PCM Reader - * @note This function : - * - Verifies that the current reader's state allows to set an option - * - Set corresponding option value - * @param context: (IN/OUT) PCM Reader context - * @param optionID: (IN) ID of the option to get - * @param Value: (IN) Variable where the option value is stored - * @return M4NO_ERROR there is no error. - * @return M4ERR_PARAMETER at least one parameter is NULL. - * @return M4ERR_BAD_OPTION_ID the optionID is not a valid one. - * @return M4ERR_STATE this option is not available now. - * @return M4ERR_NOT_IMPLEMENTED this option is not implemented - ************************************************************************ - */ -M4OSA_ERR M4PCMR_setOption(M4OSA_Context context, M4PCMR_OptionID optionID, M4OSA_DataOption Value) -{ - M4PCMR_Context *c =(M4PCMR_Context *)context; - - /* Check parameters */ - if(context == M4OSA_NULL) - { - return M4ERR_PARAMETER; - } - - /* Check reader's state */ - if((c->m_state != M4PCMR_kOpening) && (c->m_state != M4PCMR_kOpening_streamRetrieved)\ - && (c->m_state != M4PCMR_kReading)) - { - return M4ERR_STATE; - } - - /* Depend of the OptionID, the value to set is different */ - switch(optionID) - { - case M4PCMR_kPCMblockSize: - c->m_blockSize = (M4OSA_UInt32)(uintptr_t)Value; - break; - - default: - return M4ERR_BAD_OPTION_ID; - } - - return M4NO_ERROR; -} - -/*********************************************************/ -M4OSA_ERR M4PCMR_getVersion (M4_VersionInfo *pVersion) -/*********************************************************/ -{ - M4OSA_TRACE1_1("M4PCMR_getVersion called with pVersion: 0x%x", pVersion); - M4OSA_DEBUG_IF1(((M4OSA_UInt32) pVersion == 0),M4ERR_PARAMETER, - "pVersion is NULL in M4PCMR_getVersion"); - - pVersion->m_major = M4PCMR_VERSION_MAJOR; - pVersion->m_minor = M4PCMR_VERSION_MINOR; - pVersion->m_revision = M4PCMR_VERSION_REVISION; - - return M4NO_ERROR; -} diff --git a/libvideoeditor/vss/src/M4PTO3GPP_API.c b/libvideoeditor/vss/src/M4PTO3GPP_API.c deleted file mode 100755 index 042ffb7..0000000 --- a/libvideoeditor/vss/src/M4PTO3GPP_API.c +++ /dev/null @@ -1,1928 +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 M4PTO3GPP_API.c - * @brief Picture to 3gpp Service implementation. - * @note - ****************************************************************************** -*/ - -/*16 bytes signature to be written in the generated 3gp files */ -#define M4PTO3GPP_SIGNATURE "NXP-SW : PTO3GPP" - -/****************/ -/*** Includes ***/ -/****************/ - -/** - * Our header */ -#include "M4PTO3GPP_InternalTypes.h" -#include "M4PTO3GPP_API.h" - -/** - * Our errors */ -#include "M4PTO3GPP_ErrorCodes.h" - -#ifdef M4VSS_SUPPORT_ENCODER_MPEG4 -#include "VideoEditorVideoEncoder.h" -#endif - - -/** - * OSAL headers */ -#include "M4OSA_Memory.h" /* OSAL memory management */ -#include "M4OSA_Debug.h" /* OSAL debug management */ - - -/************************/ -/*** Various Magicals ***/ -/************************/ - -#define M4PTO3GPP_WRITER_AUDIO_STREAM_ID 1 -#define M4PTO3GPP_WRITER_VIDEO_STREAM_ID 2 -#define M4PTO3GPP_QUANTIZER_STEP 4 /**< Quantizer step */ -#define M4PTO3GPP_WRITER_AUDIO_PROFILE_LEVEL 0xFF /**< No specific profile and - level */ -#define M4PTO3GPP_WRITER_AUDIO_AMR_TIME_SCALE 8000 /**< AMR */ -#define M4PTO3GPP_BITRATE_REGULATION_CTS_PERIOD_IN_MS 500 /**< MAGICAL */ -#define M4PTO3GPP_MARGE_OF_FILE_SIZE 25000 /**< MAGICAL */ -/** - ****************************************************************************** - * define AMR 12.2 kbps silence frame - ****************************************************************************** -*/ -#define M4PTO3GPP_AMR_AU_SILENCE_FRAME_122_SIZE 32 -#define M4PTO3GPP_AMR_AU_SILENCE_FRAME_122_DURATION 20 -const M4OSA_UInt8 M4PTO3GPP_AMR_AU_SILENCE_122_FRAME[M4PTO3GPP_AMR_AU_SILENCE_FRAME_122_SIZE]= -{ 0x3C, 0x91, 0x17, 0x16, 0xBE, 0x66, 0x78, 0x00, 0x00, 0x01, 0xE7, 0xAF, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - -#define M4PTO3GPP_AMR_AU_SILENCE_FRAME_048_SIZE 13 -#define M4PTO3GPP_AMR_AU_SILENCE_FRAME_048_DURATION 20 -const M4OSA_UInt8 M4PTO3GPP_AMR_AU_SILENCE_048_FRAME[M4PTO3GPP_AMR_AU_SILENCE_FRAME_048_SIZE] = -{ 0x04, 0xFF, 0x18, 0xC7, 0xF0, 0x0D, 0x04, 0x33, 0xFF, 0xE0, 0x00, 0x00, 0x00 }; - -/***************************/ -/*** "Private" functions ***/ -/***************************/ -static M4OSA_ERR M4PTO3GPP_Ready4Processing(M4PTO3GPP_InternalContext* pC); - -/****************************/ -/*** "External" functions ***/ -/****************************/ -extern M4OSA_ERR M4WRITER_3GP_getInterfaces(M4WRITER_OutputFileType* pType, - M4WRITER_GlobalInterface** SrcGlobalInterface, - M4WRITER_DataInterface** SrcDataInterface); -extern M4OSA_ERR M4READER_AMR_getInterfaces(M4READER_MediaType *pMediaType, - M4READER_GlobalInterface **pRdrGlobalInterface, - M4READER_DataInterface **pRdrDataInterface); -extern M4OSA_ERR M4READER_3GP_getInterfaces(M4READER_MediaType *pMediaType, - M4READER_GlobalInterface **pRdrGlobalInterface, - M4READER_DataInterface **pRdrDataInterface); - -/****************************/ -/*** "Static" functions ***/ -/****************************/ -static M4OSA_ERR M4PTO3GPP_writeAmrSilence122Frame( - M4WRITER_DataInterface* pWriterDataIntInterface, - M4WRITER_Context* pWriterContext, - M4SYS_AccessUnit* pWriterAudioAU, - M4OSA_Time mtIncCts); -static M4OSA_ERR M4PTO3GPP_writeAmrSilence048Frame( - M4WRITER_DataInterface* pWriterDataIntInterface, - M4WRITER_Context* pWriterContext, - M4SYS_AccessUnit* pWriterAudioAU, - M4OSA_Time mtIncCts); -/** - ****************************************************************************** - * M4OSA_ERR M4PTO3GPP_GetVersion(M4_VersionInfo* pVersionInfo); - * @brief Get the M4PTO3GPP version. - * @note Can be called anytime. Do not need any context. - * @param pVersionInfo (OUT) Pointer to a version info structure - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pVersionInfo is M4OSA_NULL (If Debug Level >= 2) - ****************************************************************************** -*/ - -/*********************************************************/ -M4OSA_ERR M4PTO3GPP_GetVersion(M4_VersionInfo* pVersionInfo) -/*********************************************************/ -{ - M4OSA_TRACE3_1("M4PTO3GPP_GetVersion called with pVersionInfo=0x%x", pVersionInfo); - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL==pVersionInfo),M4ERR_PARAMETER, - "M4PTO3GPP_GetVersion: pVersionInfo is M4OSA_NULL"); - - pVersionInfo->m_major = M4PTO3GPP_VERSION_MAJOR; - pVersionInfo->m_minor = M4PTO3GPP_VERSION_MINOR; - pVersionInfo->m_revision = M4PTO3GPP_VERSION_REVISION; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4PTO3GPP_Init(M4PTO3GPP_Context* pContext); - * @brief Initializes the M4PTO3GPP (allocates an execution context). - * @note - * @param pContext (OUT) Pointer on the M4PTO3GPP context to allocate - * @param pFileReadPtrFct (IN) Pointer to OSAL file reader functions - * @param pFileWritePtrFct (IN) Pointer to OSAL file writer functions - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL (If Debug Level >= 2) - * @return M4ERR_ALLOC: There is no more available memory - ****************************************************************************** -*/ -/*********************************************************/ -M4OSA_ERR M4PTO3GPP_Init( M4PTO3GPP_Context* pContext, - M4OSA_FileReadPointer* pFileReadPtrFct, - M4OSA_FileWriterPointer* pFileWritePtrFct) -/*********************************************************/ -{ - M4PTO3GPP_InternalContext *pC; - M4OSA_UInt32 i; - - M4OSA_TRACE3_1("M4PTO3GPP_Init called with pContext=0x%x", pContext); - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER, - "M4PTO3GPP_Init: pContext is M4OSA_NULL"); - - /** - * Allocate the M4PTO3GPP context and return it to the user */ - pC = (M4PTO3GPP_InternalContext*)M4OSA_32bitAlignedMalloc(sizeof(M4PTO3GPP_InternalContext), M4PTO3GPP, - (M4OSA_Char *)"M4PTO3GPP_InternalContext"); - *pContext = pC; - if (M4OSA_NULL == pC) - { - M4OSA_TRACE1_0("M4PTO3GPP_Step(): unable to allocate M4PTO3GPP_InternalContext,\ - returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - - /** - * Init the context. All pointers must be initialized to M4OSA_NULL because CleanUp() - can be called just after Init(). */ - pC->m_State = M4PTO3GPP_kState_CREATED; - pC->m_VideoState = M4PTO3GPP_kStreamState_NOSTREAM; - pC->m_AudioState = M4PTO3GPP_kStreamState_NOSTREAM; - - /** - * Reader stuff */ - pC->m_pReaderAudioAU = M4OSA_NULL; - pC->m_pReaderAudioStream = M4OSA_NULL; - - /** - * Writer stuff */ - pC->m_pEncoderHeader = M4OSA_NULL; - pC->m_pWriterVideoStream = M4OSA_NULL; - pC->m_pWriterAudioStream = M4OSA_NULL; - pC->m_pWriterVideoStreamInfo= M4OSA_NULL; - pC->m_pWriterAudioStreamInfo= M4OSA_NULL; - - /** - * Contexts of the used modules */ - pC->m_pAudioReaderContext = M4OSA_NULL; - pC->m_p3gpWriterContext = M4OSA_NULL; - pC->m_pMp4EncoderContext = M4OSA_NULL; - pC->m_eEncoderState = M4PTO3GPP_kNoEncoder; - - /** - * Interfaces of the used modules */ - pC->m_pReaderGlobInt = M4OSA_NULL; - pC->m_pReaderDataInt = M4OSA_NULL; - pC->m_pWriterGlobInt = M4OSA_NULL; - pC->m_pWriterDataInt = M4OSA_NULL; - pC->m_pEncoderInt = M4OSA_NULL; - pC->m_pEncoderExternalAPI = M4OSA_NULL; - pC->m_pEncoderUserData = M4OSA_NULL; - - /** - * Fill the OSAL file function set */ - pC->pOsalFileRead = pFileReadPtrFct; - pC->pOsalFileWrite = pFileWritePtrFct; - - /** - * Video rate control stuff */ - pC->m_mtCts = 0.0F; - pC->m_mtNextCts = 0.0F; - pC->m_mtAudioCts = 0.0F; - pC->m_AudioOffSet = 0.0F; - pC->m_dLastVideoRegulCts= 0.0F; - pC->m_PrevAudioCts = 0.0F; - pC->m_DeltaAudioCts = 0.0F; - - pC->m_MaxFileSize = 0; - pC->m_CurrentFileSize = 0; - - pC->m_IsLastPicture = M4OSA_FALSE; - pC->m_bAudioPaddingSilence = M4OSA_FALSE; - pC->m_bLastInternalCallBack = M4OSA_FALSE; - pC->m_NbCurrentFrame = 0; - - pC->pSavedPlane = M4OSA_NULL; - pC->uiSavedDuration = 0; - - M4OSA_TRACE3_0("M4PTO3GPP_Init(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4PTO3GPP_Open(M4PTO3GPP_Context pContext, M4PTO3GPP_Params* pParams); - * @brief Set the M4PTO3GPP input and output files. - * @note It opens the input file, but the output file may not be created yet. - * @param pContext (IN) M4PTO3GPP context - * @param pParams (IN) Pointer to the parameters for the PTO3GPP. - * @note The pointed structure can be de-allocated after this function returns because - * it is internally copied by the PTO3GPP - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_STATE: M4PTO3GPP is not in an appropriate state for this function to be - called - * @return M4ERR_ALLOC: There is no more available memory - * @return ERR_PTO3GPP_INVALID_VIDEO_FRAME_SIZE_FOR_H263 The output video frame - * size parameter is incompatible with H263 encoding - * @return ERR_PTO3GPP_UNDEFINED_OUTPUT_VIDEO_FORMAT The output video format - parameter is undefined - * @return ERR_PTO3GPP_UNDEFINED_OUTPUT_VIDEO_BITRATE The output video bit-rate parameter - is undefined - * @return ERR_PTO3GPP_UNDEFINED_OUTPUT_VIDEO_FRAME_SIZE The output video frame size parameter - is undefined - * @return ERR_PTO3GPP_UNDEFINED_OUTPUT_FILE_SIZE The output file size parameter - is undefined - * @return ERR_PTO3GPP_UNDEFINED_AUDIO_PADDING The output audio padding parameter - is undefined - * @return ERR_PTO3GPP_UNHANDLED_AUDIO_TRACK_INPUT_FILE The input audio file contains - a track format not handled by PTO3GPP - ****************************************************************************** -*/ -/*********************************************************/ -M4OSA_ERR M4PTO3GPP_Open(M4PTO3GPP_Context pContext, M4PTO3GPP_Params* pParams) -/*********************************************************/ -{ - M4PTO3GPP_InternalContext *pC = (M4PTO3GPP_InternalContext*)(pContext); - M4OSA_ERR err = M4NO_ERROR; - - M4READER_MediaFamily mediaFamily; - M4_StreamHandler* pStreamHandler; - M4READER_MediaType readerMediaType; - - M4OSA_TRACE2_2("M4PTO3GPP_Open called with pContext=0x%x, pParams=0x%x", pContext, pParams); - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER, \ - "M4PTO3GPP_Open: pContext is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pParams), M4ERR_PARAMETER, \ - "M4PTO3GPP_Open: pParams is M4OSA_NULL"); - - /** - * Check parameters correctness */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pParams->pPictureCallbackFct), - M4ERR_PARAMETER, "M4PTO3GPP_Open: pC->m_Params.pPictureCallbackFct is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pParams->pPictureCallbackCtxt), - M4ERR_PARAMETER, - "M4PTO3GPP_Open: pC->m_Params.pPictureCallbackCtxt is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pParams->pOutput3gppFile), - M4ERR_PARAMETER, "M4PTO3GPP_Open: pC->m_Params.pOutput3gppFile is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pParams->pTemporaryFile), - M4ERR_PARAMETER, "M4PTO3GPP_Open: pC->m_Params.pTemporaryFile is M4OSA_NULL"); - - /** - * Video Format */ - if( (M4VIDEOEDITING_kH263 != pParams->OutputVideoFormat) && - (M4VIDEOEDITING_kMPEG4 != pParams->OutputVideoFormat) && - (M4VIDEOEDITING_kH264 != pParams->OutputVideoFormat)) { - M4OSA_TRACE1_0("M4PTO3GPP_Open: Undefined output video format"); - return ERR_PTO3GPP_UNDEFINED_OUTPUT_VIDEO_FORMAT; - } - - /** - * Video Bitrate */ - if(!((M4VIDEOEDITING_k16_KBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k24_KBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k32_KBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k48_KBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k64_KBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k96_KBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k128_KBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k192_KBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k256_KBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k288_KBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k384_KBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k512_KBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k800_KBPS == pParams->OutputVideoBitrate) || - /*+ New Encoder bitrates */ - (M4VIDEOEDITING_k2_MBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k5_MBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_k8_MBPS == pParams->OutputVideoBitrate) || - (M4VIDEOEDITING_kVARIABLE_KBPS == pParams->OutputVideoBitrate))) { - M4OSA_TRACE1_0("M4PTO3GPP_Open: Undefined output video bitrate"); - return ERR_PTO3GPP_UNDEFINED_OUTPUT_VIDEO_BITRATE; - } - - /** - * Video frame size */ - if (!((M4VIDEOEDITING_kSQCIF == pParams->OutputVideoFrameSize) || - (M4VIDEOEDITING_kQQVGA == pParams->OutputVideoFrameSize) || - (M4VIDEOEDITING_kQCIF == pParams->OutputVideoFrameSize) || - (M4VIDEOEDITING_kQVGA == pParams->OutputVideoFrameSize) || - (M4VIDEOEDITING_kCIF == pParams->OutputVideoFrameSize) || - (M4VIDEOEDITING_kVGA == pParams->OutputVideoFrameSize) || - - (M4VIDEOEDITING_kNTSC == pParams->OutputVideoFrameSize) || - (M4VIDEOEDITING_kWVGA == pParams->OutputVideoFrameSize) || - - (M4VIDEOEDITING_k640_360 == pParams->OutputVideoFrameSize) || - (M4VIDEOEDITING_k854_480 == pParams->OutputVideoFrameSize) || - (M4VIDEOEDITING_k1280_720 == pParams->OutputVideoFrameSize) || - (M4VIDEOEDITING_k1080_720 == pParams->OutputVideoFrameSize) || - (M4VIDEOEDITING_k960_720 == pParams->OutputVideoFrameSize) || - (M4VIDEOEDITING_k1920_1080 == pParams->OutputVideoFrameSize))) { - M4OSA_TRACE1_0("M4PTO3GPP_Open: Undefined output video frame size"); - return ERR_PTO3GPP_UNDEFINED_OUTPUT_VIDEO_FRAME_SIZE; - } - - /** - * Maximum size of the output 3GPP file */ - if (!((M4PTO3GPP_k50_KB == pParams->OutputFileMaxSize) || - (M4PTO3GPP_k75_KB == pParams->OutputFileMaxSize) || - (M4PTO3GPP_k100_KB == pParams->OutputFileMaxSize) || - (M4PTO3GPP_k150_KB == pParams->OutputFileMaxSize) || - (M4PTO3GPP_k200_KB == pParams->OutputFileMaxSize) || - (M4PTO3GPP_k300_KB == pParams->OutputFileMaxSize) || - (M4PTO3GPP_k400_KB == pParams->OutputFileMaxSize) || - (M4PTO3GPP_k500_KB == pParams->OutputFileMaxSize) || - (M4PTO3GPP_kUNLIMITED == pParams->OutputFileMaxSize))) { - M4OSA_TRACE1_0("M4PTO3GPP_Open: Undefined output 3GPP file size"); - return ERR_PTO3GPP_UNDEFINED_OUTPUT_FILE_SIZE; - } - - /* Audio padding */ - if (M4OSA_NULL != pParams->pInputAudioTrackFile) { - if ((!( (M4PTO3GPP_kAudioPaddingMode_None == pParams->AudioPaddingMode) || - (M4PTO3GPP_kAudioPaddingMode_Silence== pParams->AudioPaddingMode) || - (M4PTO3GPP_kAudioPaddingMode_Loop == pParams->AudioPaddingMode)))) { - M4OSA_TRACE1_0("M4PTO3GPP_Open: Undefined audio padding"); - return ERR_PTO3GPP_UNDEFINED_AUDIO_PADDING; - } - } - - /**< Size check for H263 (only valid sizes are CIF, QCIF and SQCIF) */ - if ((M4VIDEOEDITING_kH263 == pParams->OutputVideoFormat) && - (M4VIDEOEDITING_kSQCIF != pParams->OutputVideoFrameSize) && - (M4VIDEOEDITING_kQCIF != pParams->OutputVideoFrameSize) && - (M4VIDEOEDITING_kCIF != pParams->OutputVideoFrameSize)) { - M4OSA_TRACE1_0("M4PTO3GPP_Open():\ - returning ERR_PTO3GPP_INVALID_VIDEO_FRAME_SIZE_FOR_H263"); - return ERR_PTO3GPP_INVALID_VIDEO_FRAME_SIZE_FOR_H263; - } - - /** - * Check state automaton */ - if (M4PTO3GPP_kState_CREATED != pC->m_State) { - M4OSA_TRACE1_1("M4PTO3GPP_Open(): Wrong State (%d), returning M4ERR_STATE", pC->m_State); - return M4ERR_STATE; - } - - /** - * Copy the M4PTO3GPP_Params structure */ - memcpy((void *)(&pC->m_Params), - (void *)pParams, sizeof(M4PTO3GPP_Params)); - M4OSA_TRACE1_1("M4PTO3GPP_Open: outputVideoBitrate = %d", pC->m_Params.OutputVideoBitrate); - - /***********************************/ - /* Open input file with the reader */ - /***********************************/ - if (M4OSA_NULL != pC->m_Params.pInputAudioTrackFile) { - /** - * Get the reader interface according to the input audio file type */ - switch(pC->m_Params.AudioFileFormat) - { -#ifdef M4VSS_SUPPORT_READER_AMR - case M4VIDEOEDITING_kFileType_AMR: - err = M4READER_AMR_getInterfaces( &readerMediaType, &pC->m_pReaderGlobInt, - &pC->m_pReaderDataInt); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Open(): M4READER_AMR_getInterfaces returns 0x%x", err); - return err; - } - break; -#endif - -#ifdef AAC_SUPPORTED - case M4VIDEOEDITING_kFileType_3GPP: - err = M4READER_3GP_getInterfaces( &readerMediaType, &pC->m_pReaderGlobInt, - &pC->m_pReaderDataInt); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Open(): M4READER_3GP_getInterfaces returns 0x%x", err); - return err; - } - break; -#endif - - default: - return ERR_PTO3GPP_UNHANDLED_AUDIO_TRACK_INPUT_FILE; - } - - /** - * Initializes the reader shell */ - err = pC->m_pReaderGlobInt->m_pFctCreate(&pC->m_pAudioReaderContext); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Open(): pReaderGlobInt->m_pFctCreate returns 0x%x", err); - return err; - } - - pC->m_pReaderDataInt->m_readerContext = pC->m_pAudioReaderContext; - /**< Link the reader interface to the reader context */ - - /** - * Set the reader shell file access functions */ - err = pC->m_pReaderGlobInt->m_pFctSetOption(pC->m_pAudioReaderContext, - M4READER_kOptionID_SetOsaFileReaderFctsPtr, (M4OSA_DataOption)pC->pOsalFileRead); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Open(): pReaderGlobInt->m_pFctSetOption returns 0x%x", err); - return err; - } - - /** - * Open the input audio file */ - err = pC->m_pReaderGlobInt->m_pFctOpen(pC->m_pAudioReaderContext, - pC->m_Params.pInputAudioTrackFile); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Open(): pReaderGlobInt->m_pFctOpen returns 0x%x", err); - pC->m_pReaderGlobInt->m_pFctDestroy(pC->m_pAudioReaderContext); - pC->m_pAudioReaderContext = M4OSA_NULL; - return err; - } - - /** - * Get the audio streams from the input file */ - err = M4NO_ERROR; - while (M4NO_ERROR == err) - { - err = pC->m_pReaderGlobInt->m_pFctGetNextStream(pC->m_pAudioReaderContext, - &mediaFamily, &pStreamHandler); - - if((err == ((M4OSA_UInt32)M4ERR_READER_UNKNOWN_STREAM_TYPE)) || - (err == ((M4OSA_UInt32)M4WAR_TOO_MUCH_STREAMS))) - { - err = M4NO_ERROR; - continue; - } - - if (M4NO_ERROR == err) /**< One stream found */ - { - /**< Found an audio stream */ - if ((M4READER_kMediaFamilyAudio == mediaFamily) - && (M4OSA_NULL == pC->m_pReaderAudioStream)) - { - pC->m_pReaderAudioStream = (M4_AudioStreamHandler*)pStreamHandler; - /**< Keep pointer to the audio stream */ - M4OSA_TRACE3_0("M4PTO3GPP_Open(): Found an audio stream in input"); - pStreamHandler->m_bStreamIsOK = M4OSA_TRUE; - - /** - * Allocate audio AU used for read operations */ - pC->m_pReaderAudioAU = (M4_AccessUnit*)M4OSA_32bitAlignedMalloc(sizeof(M4_AccessUnit), - M4PTO3GPP,(M4OSA_Char *)"pReaderAudioAU"); - if (M4OSA_NULL == pC->m_pReaderAudioAU) - { - M4OSA_TRACE1_0("M4PTO3GPP_Open(): unable to allocate pReaderAudioAU, \ - returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - - /** - * Initializes an access Unit */ - err = pC->m_pReaderGlobInt->m_pFctFillAuStruct(pC->m_pAudioReaderContext, - pStreamHandler, pC->m_pReaderAudioAU); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Open():\ - pReaderGlobInt->m_pFctFillAuStruct(audio)returns 0x%x", err); - return err; - } - } - else - { - pStreamHandler->m_bStreamIsOK = M4OSA_FALSE; - } - } - else if (M4WAR_NO_MORE_STREAM != err) /**< Unexpected error code */ - { - M4OSA_TRACE1_1("M4PTO3GPP_Open():\ - pReaderGlobInt->m_pFctGetNextStream returns 0x%x", - err); - return err; - } - } /* while*/ - } /*if (M4OSA_NULL != pC->m_Params.pInputAudioTrackFile)*/ - - pC->m_VideoState = M4PTO3GPP_kStreamState_STARTED; - - /** - * Init the audio stream */ - if (M4OSA_NULL != pC->m_pReaderAudioStream) - { - pC->m_AudioState = M4PTO3GPP_kStreamState_STARTED; - err = pC->m_pReaderGlobInt->m_pFctReset(pC->m_pAudioReaderContext, - (M4_StreamHandler*)pC->m_pReaderAudioStream); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Open(): pReaderDataInt->m_pFctReset(audio returns 0x%x", - err); - return err; - } - } - - /** - * Update state automaton */ - pC->m_State = M4PTO3GPP_kState_OPENED; - - /** - * Get the max File size */ - switch(pC->m_Params.OutputFileMaxSize) - { - case M4PTO3GPP_k50_KB: pC->m_MaxFileSize = 50000; break; - case M4PTO3GPP_k75_KB: pC->m_MaxFileSize = 75000; break; - case M4PTO3GPP_k100_KB: pC->m_MaxFileSize = 100000; break; - case M4PTO3GPP_k150_KB: pC->m_MaxFileSize = 150000; break; - case M4PTO3GPP_k200_KB: pC->m_MaxFileSize = 200000; break; - case M4PTO3GPP_k300_KB: pC->m_MaxFileSize = 300000; break; - case M4PTO3GPP_k400_KB: pC->m_MaxFileSize = 400000; break; - case M4PTO3GPP_k500_KB: pC->m_MaxFileSize = 500000; break; - case M4PTO3GPP_kUNLIMITED: - default: break; - } - - M4OSA_TRACE3_0("M4PTO3GPP_Open(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4PTO3GPP_Step(M4PTO3GPP_Context pContext); - * @brief Perform one step of trancoding. - * @note - * @param pContext (IN) M4PTO3GPP context - * @return M4NO_ERROR No error - * @return M4ERR_PARAMETER pContext is M4OSA_NULL - * @return M4ERR_STATE: M4PTO3GPP is not in an appropriate state for this function - * to be called - * @return M4PTO3GPP_WAR_END_OF_PROCESSING Encoding completed - ****************************************************************************** -*/ -/*********************************************************/ -M4OSA_ERR M4PTO3GPP_Step(M4PTO3GPP_Context pContext) -/*********************************************************/ -{ - M4PTO3GPP_InternalContext *pC = (M4PTO3GPP_InternalContext*)(pContext); - M4OSA_ERR err = M4NO_ERROR; - M4OSA_UInt32 l_uiAudioStepCount = 0; - M4OSA_Int32 JumpToTime = 0; - M4OSA_Time mtIncCts; - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL==pContext), M4ERR_PARAMETER, - "M4PTO3GPP_Step: pContext is M4OSA_NULL"); - - /** - * Check state automaton */ - if ( !((M4PTO3GPP_kState_OPENED == pC->m_State) || (M4PTO3GPP_kState_READY == pC->m_State)) ) - { - M4OSA_TRACE1_1("M4PTO3GPP_Step(): Wrong State (%d), returning M4ERR_STATE", pC->m_State); - return M4ERR_STATE; - } - - /******************************************************************/ - /** - * In case this is the first step, we prepare the decoder, the encoder and the writer */ - if (M4PTO3GPP_kState_OPENED == pC->m_State) - { - M4OSA_TRACE2_0("M4PTO3GPP_Step(): This is the first step, \ - calling M4PTO3GPP_Ready4Processing"); - - /** - * Prepare the reader, the decoder, the encoder, the writer... */ - err = M4PTO3GPP_Ready4Processing(pC); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Step(): M4PTO3GPP_Ready4Processing() returns 0x%x", err); - return err; - } - - /** - * Update state automaton */ - pC->m_State = M4PTO3GPP_kState_READY; - - M4OSA_TRACE3_0("M4PTO3GPP_Step(): returning M4NO_ERROR (a)"); - return M4NO_ERROR; /**< we only do that in the first step, \ - first REAL step will be the next one */ - } - - - /* - * Check if we reached the targeted file size. - * We do that before the encoding, because the core encoder has to know if this is - * the last frame to encode */ - err = pC->m_pWriterGlobInt->pFctGetOption(pC->m_p3gpWriterContext, - M4WRITER_kFileSizeAudioEstimated, (M4OSA_DataOption) &pC->m_CurrentFileSize); - if ((0 != pC->m_MaxFileSize) && - /**< Add a marge to the file size in order to never exceed the max file size */ - ((pC->m_CurrentFileSize + M4PTO3GPP_MARGE_OF_FILE_SIZE) >= pC->m_MaxFileSize)) - { - pC->m_IsLastPicture = M4OSA_TRUE; - } - - /****************************************************************** - * At that point we are in M4PTO3GPP_kState_READY state - * We perform one step of video encoding - ******************************************************************/ - - /************* VIDEO ENCODING ***************/ - if (M4PTO3GPP_kStreamState_STARTED == pC->m_VideoState) /**<If the video encoding is going on*/ - { /** - * Call the encoder */ - pC->m_NbCurrentFrame++; - - /* Check if it is the last frame the to encode */ - if((pC->m_Params.NbVideoFrames > 0) \ - && (pC->m_NbCurrentFrame >= pC->m_Params.NbVideoFrames)) - { - pC->m_IsLastPicture = M4OSA_TRUE; - } - - M4OSA_TRACE2_2("M4PTO3GPP_Step(): Calling pEncoderInt->pFctEncode with videoCts = %.2f\ - nb = %lu", pC->m_mtCts, pC->m_NbCurrentFrame); - - err = pC->m_pEncoderInt->pFctEncode(pC->m_pMp4EncoderContext, M4OSA_NULL, - /**< The input plane is null because the input Picture will be obtained by the\ - VPP filter from the context */ - pC->m_mtCts, - (pC->m_IsLastPicture ? - M4ENCODER_kLastFrame : M4ENCODER_kNormalFrame) ); - /**< Last param set to M4OSA_TRUE signals that this is the last frame to be encoded,\ - M4OSA_FALSE else */ - - M4OSA_TRACE3_2("M4PTO3GPP_Step(): pEncoderInt->pFctEncode returns 0x%x, vidFormat =0x%x", - err, pC->m_Params.OutputVideoFormat); - if((M4NO_ERROR == err) && (M4VIDEOEDITING_kH264 == pC->m_Params.OutputVideoFormat)) - { - /* Check if last frame.* - * */ - if(M4OSA_TRUE == pC->m_IsLastPicture) - { - M4OSA_TRACE3_0("M4PTO3GPP_Step(): Last picture"); - pC->m_VideoState = M4PTO3GPP_kStreamState_FINISHED; - } - - } - - if (M4WAR_NO_MORE_AU == err) /**< The video encoding is finished */ - { - M4OSA_TRACE3_0("M4PTO3GPP_Step(): pEncoderInt->pFctEncode returns M4WAR_NO_MORE_AU"); - pC->m_VideoState = M4PTO3GPP_kStreamState_FINISHED; - } - else if (M4NO_ERROR != err) /**< Unexpected error code */ - { - if( (((M4OSA_UInt32)M4WAR_WRITER_STOP_REQ) == err) || - (((M4OSA_UInt32)M4ERR_ALLOC) == err) ) - { - M4OSA_TRACE1_0("M4PTO3GPP_Step: returning ERR_PTO3GPP_ENCODER_ACCES_UNIT_ERROR"); - return ERR_PTO3GPP_ENCODER_ACCES_UNIT_ERROR; - } - else - { - M4OSA_TRACE1_1("M4PTO3GPP_Step(): pEncoderInt->pFctEncode(last) (a) returns 0x%x", - err); - return err; - } - } - } /**< End of video encoding */ - - - /****** AUDIO TRANSCODING (read + null encoding + write) ******/ - if (M4PTO3GPP_kStreamState_STARTED == pC->m_AudioState) - { - while ( (M4PTO3GPP_kStreamState_STARTED == pC->m_AudioState) && - (pC->m_mtAudioCts < pC->m_mtNextCts)) - - { - l_uiAudioStepCount++; - if (M4OSA_FALSE == pC->m_bAudioPaddingSilence) - { - /**< Read the next audio AU in the input Audio file */ - err = pC->m_pReaderDataInt->m_pFctGetNextAu(pC->m_pAudioReaderContext, - (M4_StreamHandler*)pC->m_pReaderAudioStream, pC->m_pReaderAudioAU); - pC->m_mtAudioCts = pC->m_pReaderAudioAU->m_CTS + pC->m_AudioOffSet; - - if (M4WAR_NO_MORE_AU == err) /* The audio transcoding is finished */ - { - M4OSA_TRACE2_0("M4PTO3GPP_Step():\ - pReaderDataInt->m_pFctGetNextAu(audio) returns \ - M4WAR_NO_MORE_AU"); - switch(pC->m_Params.AudioPaddingMode) - { - case M4PTO3GPP_kAudioPaddingMode_None: - - pC->m_AudioState = M4PTO3GPP_kStreamState_FINISHED; - break; - - case M4PTO3GPP_kAudioPaddingMode_Silence: - - if (M4DA_StreamTypeAudioAmrNarrowBand - != pC->m_pReaderAudioStream->m_basicProperties.m_streamType) - /**< Do nothing if the input audio file format is not AMR */ - { - pC->m_AudioState = M4PTO3GPP_kStreamState_FINISHED; - } - else - { - pC->m_bAudioPaddingSilence = M4OSA_TRUE; - } - break; - - case M4PTO3GPP_kAudioPaddingMode_Loop: - - /**< Jump to the beginning of the audio file */ - err = pC->m_pReaderGlobInt->m_pFctJump(pC->m_pAudioReaderContext, - (M4_StreamHandler*)pC->m_pReaderAudioStream, &JumpToTime); - - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Step(): \ - pReaderDataInt->m_pFctReset(audio returns 0x%x", - err); - return err; - } - - if (M4DA_StreamTypeAudioAmrNarrowBand - == pC->m_pReaderAudioStream->m_basicProperties.m_streamType) - { - pC->m_mtAudioCts += 20; /*< SEMC bug fixed at Lund */ - pC->m_AudioOffSet = pC->m_mtAudioCts; - - /** - * 'BZZZ' bug fix: - * add a silence frame */ - mtIncCts = (M4OSA_Time)((pC->m_mtAudioCts) * - (pC->m_pWriterAudioStream->timeScale / 1000.0)); - err = M4PTO3GPP_writeAmrSilence122Frame(pC->m_pWriterDataInt, - pC->m_p3gpWriterContext, &pC->m_WriterAudioAU, mtIncCts); - - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Step(): \ - M4PTO3GPP_AddAmrSilenceSid returns 0x%x", err); - return err; - }/**< Add => no audio cts increment...*/ - } - else - { - pC->m_AudioOffSet = pC->m_mtAudioCts + pC->m_DeltaAudioCts; - } - break; - } /* end of: switch */ - } - else if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Step(): pReaderDataInt->m_pFctGetNextAu(Audio)\ - returns 0x%x", err); - return err; - } - else - { - /** - * Save the delta Cts (AAC only) */ - pC->m_DeltaAudioCts = pC->m_pReaderAudioAU->m_CTS - pC->m_PrevAudioCts; - pC->m_PrevAudioCts = pC->m_pReaderAudioAU->m_CTS; - - /** - * Prepare the writer AU */ - err = pC->m_pWriterDataInt->pStartAU(pC->m_p3gpWriterContext, 1, - &pC->m_WriterAudioAU); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Step(): pWriterDataInt->pStartAU(Audio)\ - returns 0x%x", err); - return err; - } - - /** - * Copy audio data from reader AU to writer AU */ - M4OSA_TRACE2_1("M4PTO3GPP_Step(): Copying audio AU: size=%d", - pC->m_pReaderAudioAU->m_size); - memcpy((void *)pC->m_WriterAudioAU.dataAddress, - (void *)pC->m_pReaderAudioAU->m_dataAddress, - pC->m_pReaderAudioAU->m_size); - pC->m_WriterAudioAU.size = pC->m_pReaderAudioAU->m_size; - - /** - * Convert CTS unit from milliseconds to timescale */ - if (M4DA_StreamTypeAudioAmrNarrowBand - != pC->m_pReaderAudioStream->m_basicProperties.m_streamType) - { - pC->m_WriterAudioAU.CTS = (M4OSA_Time) - ((pC->m_AudioOffSet + pC->m_pReaderAudioAU->m_CTS) - * pC->m_pWriterAudioStream->timeScale / 1000.0); - } - else - { - pC->m_WriterAudioAU.CTS = (M4OSA_Time)(pC->m_mtAudioCts * - (pC->m_pWriterAudioStream->timeScale / 1000.0)); - } - pC->m_WriterAudioAU.nbFrag = 0; - M4OSA_TRACE2_1("M4PTO3GPP_Step(): audio AU: CTS=%d ms", pC->m_mtAudioCts - /*pC->m_pReaderAudioAU->m_CTS*/); - - /** - * Write it to the output file */ - err = pC->m_pWriterDataInt->pProcessAU(pC->m_p3gpWriterContext, 1, - &pC->m_WriterAudioAU); - - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Step(): pWriterDataInt->pProcessAU(Audio)\ - returns 0x%x", err); - return err; - } - } - } - else /**< M4OSA_TRUE == pC->m_bAudioPaddingSilence */ - { - if (M4DA_StreamTypeAudioAmrNarrowBand == - pC->m_pReaderAudioStream->m_basicProperties.m_streamType) - { - /** - * Fill in audio au with silence */ - pC->m_mtAudioCts += 20; - - /** - * Padd with silence */ - mtIncCts = (M4OSA_Time)(pC->m_mtAudioCts - * (pC->m_pWriterAudioStream->timeScale / 1000.0)); - err = M4PTO3GPP_writeAmrSilence048Frame(pC->m_pWriterDataInt, - pC->m_p3gpWriterContext, &pC->m_WriterAudioAU, mtIncCts); - - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Step(): M4PTO3GPP_AddAmrSilenceSid returns 0x%x", - err); - return err; - } - } - else /**< Do nothing if the input audio file format is not AMR */ - { - pC->m_AudioState = M4PTO3GPP_kStreamState_FINISHED; - } - - } - } /**< while */ - } /**< End of audio encoding */ - - pC->m_mtCts = pC->m_mtNextCts; - - /** - * The transcoding is finished when no stream is being encoded anymore */ - if (M4PTO3GPP_kStreamState_FINISHED == pC->m_VideoState) - { - pC->m_State = M4PTO3GPP_kState_FINISHED; - M4OSA_TRACE2_0("M4PTO3GPP_Step(): transcoding finished, returning M4WAR_NO_MORE_AU"); - return M4PTO3GPP_WAR_END_OF_PROCESSING; - } - - M4OSA_TRACE3_0("M4PTO3GPP_Step(): returning M4NO_ERROR (b)"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4PTO3GPP_Close(M4PTO3GPP_Context pContext); - * @brief Finish the M4PTO3GPP transcoding. - * @note The output 3GPP file is ready to be played after this call - * @param pContext (IN) M4PTO3GPP context - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (If Debug Level >= 2) - * @return M4ERR_STATE: M4PTO3GPP is not in an appropriate state for this function to be called - ****************************************************************************** -*/ -/*********************************************************/ -M4OSA_ERR M4PTO3GPP_Close(M4PTO3GPP_Context pContext) -/*********************************************************/ -{ - M4PTO3GPP_InternalContext *pC = (M4PTO3GPP_InternalContext*)(pContext); - M4OSA_ERR osaErr = M4NO_ERROR; - M4OSA_UInt32 lastCTS; - M4ENCODER_Header* encHeader; - M4SYS_StreamIDmemAddr streamHeader; - - M4OSA_TRACE3_1("M4PTO3GPP_Close called with pContext=0x%x", pContext); - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL==pContext), M4ERR_PARAMETER, "M4PTO3GPP_Close:\ - pContext is M4OSA_NULL"); - - /* Check state automaton */ - if ((pC->m_State != M4PTO3GPP_kState_OPENED) && - (pC->m_State != M4PTO3GPP_kState_READY) && - (pC->m_State != M4PTO3GPP_kState_FINISHED)) - { - M4OSA_TRACE1_1("M4PTO3GPP_Close(): Wrong State (%d), returning M4ERR_STATE", pC->m_State); - return M4ERR_STATE; - } - - /*************************************/ - /******** Finish the encoding ********/ - /*************************************/ - if (M4PTO3GPP_kState_READY == pC->m_State) - { - pC->m_State = M4PTO3GPP_kState_FINISHED; - } - - if (M4PTO3GPP_kEncoderRunning == pC->m_eEncoderState) - { - if (pC->m_pEncoderInt->pFctStop != M4OSA_NULL) - { - osaErr = pC->m_pEncoderInt->pFctStop(pC->m_pMp4EncoderContext); - if (M4NO_ERROR != osaErr) - { - M4OSA_TRACE1_1("M4PTO3GPP_close: m_pEncoderInt->pFctStop returns 0x%x", osaErr); - /* Well... how the heck do you handle a failed cleanup? */ - } - } - - pC->m_eEncoderState = M4PTO3GPP_kEncoderStopped; - } - - /* Has the encoder actually been opened? Don't close it if that's not the case. */ - if (M4PTO3GPP_kEncoderStopped == pC->m_eEncoderState) - { - osaErr = pC->m_pEncoderInt->pFctClose(pC->m_pMp4EncoderContext); - if (M4NO_ERROR != osaErr) - { - M4OSA_TRACE1_1("M4PTO3GPP_close: m_pEncoderInt->pFctClose returns 0x%x", osaErr); - /* Well... how the heck do you handle a failed cleanup? */ - } - - pC->m_eEncoderState = M4PTO3GPP_kEncoderClosed; - } - - /*******************************/ - /******** Close 3GP out ********/ - /*******************************/ - - if (M4OSA_NULL != pC->m_p3gpWriterContext) /* happens in state _SET */ - { - /* HW encoder: fetch the DSI from the shell video encoder, and feed it to the writer before - closing it. */ - if ((M4VIDEOEDITING_kMPEG4 == pC->m_Params.OutputVideoFormat) - || (M4VIDEOEDITING_kH264 == pC->m_Params.OutputVideoFormat)) - { - osaErr = pC->m_pEncoderInt->pFctGetOption(pC->m_pMp4EncoderContext, - M4ENCODER_kOptionID_EncoderHeader, - (M4OSA_DataOption)&encHeader); - if ( (M4NO_ERROR != osaErr) || (M4OSA_NULL == encHeader->pBuf) ) - { - M4OSA_TRACE1_1("M4PTO3GPP_close: failed to get the encoder header (err 0x%x)", - osaErr); - /**< no return here, we still have stuff to deallocate after close, even if \ - it fails. */ - } - else - { - /* set this header in the writer */ - streamHeader.streamID = M4PTO3GPP_WRITER_VIDEO_STREAM_ID; - streamHeader.size = encHeader->Size; - streamHeader.addr = (M4OSA_MemAddr32)encHeader->pBuf; - osaErr = pC->m_pWriterGlobInt->pFctSetOption(pC->m_p3gpWriterContext, - M4WRITER_kDSI, &streamHeader); - if (M4NO_ERROR != osaErr) - { - M4OSA_TRACE1_1("M4PTO3GPP_close: failed to set the DSI in the writer \ - (err 0x%x) ", osaErr); - } - } - } - - /* Update last Video CTS */ - lastCTS = (M4OSA_UInt32)pC->m_mtCts; - - osaErr = pC->m_pWriterGlobInt->pFctSetOption(pC->m_p3gpWriterContext, - (M4OSA_UInt32)M4WRITER_kMaxFileDuration, &lastCTS); - if (M4NO_ERROR != osaErr) - { - M4OSA_TRACE1_1("M4PTO3GPP_Close: SetOption(M4WRITER_kMaxFileDuration) returns 0x%x", - osaErr); - } - - /* Write and close the 3GP output file */ - osaErr = pC->m_pWriterGlobInt->pFctCloseWrite(pC->m_p3gpWriterContext); - if (M4NO_ERROR != osaErr) - { - M4OSA_TRACE1_1("M4PTO3GPP_Close: pWriterGlobInt->pFctCloseWrite returns 0x%x", osaErr); - /**< don't return yet, we have to close other things */ - } - pC->m_p3gpWriterContext = M4OSA_NULL; - } - - /** - * State transition */ - pC->m_State = M4PTO3GPP_kState_CLOSED; - - M4OSA_TRACE3_1("M4PTO3GPP_Close(): returning 0x%x", osaErr); - return osaErr; -} - - -/** - ****************************************************************************** - * M4OSA_ERR M4PTO3GPP_CleanUp(M4PTO3GPP_Context pContext); - * @brief Free all resources used by the M4PTO3GPP. - * @note The context is no more valid after this call - * @param pContext (IN) M4PTO3GPP context - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (If Debug Level >= 2) - ****************************************************************************** -*/ -/*********************************************************/ -M4OSA_ERR M4PTO3GPP_CleanUp(M4PTO3GPP_Context pContext) -/*********************************************************/ -{ - M4OSA_ERR err = M4NO_ERROR; - M4PTO3GPP_InternalContext *pC = (M4PTO3GPP_InternalContext*)(pContext); - - M4OSA_TRACE3_1("M4PTO3GPP_CleanUp called with pContext=0x%x", pContext); - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL==pContext),M4ERR_PARAMETER, "M4PTO3GPP_CleanUp: pContext \ - is M4OSA_NULL"); - - /** - * First call Close, if needed, to clean the video encoder */ - - if ((M4PTO3GPP_kState_OPENED == pC->m_State) || (M4PTO3GPP_kState_READY == pC->m_State) - || (M4PTO3GPP_kState_FINISHED == pC->m_State)) - { - err = M4PTO3GPP_Close(pContext); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_CleanUp: M4PTO3GPP_Close returns 0x%x", err); - /**< don't return, we have to free other components */ - } - } - - /** - * Free Audio reader stuff, if needed */ - - if (M4OSA_NULL != pC->m_pAudioReaderContext) /**< may be M4OSA_NULL if M4PTO3GPP_Open was not\ - called */ - { - - err = pC->m_pReaderGlobInt->m_pFctClose(pC->m_pAudioReaderContext); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_CleanUp: pReaderGlobInt->m_pFctClose returns 0x%x", err); - /**< don't return, we have to free other components */ - } - err = pC->m_pReaderGlobInt->m_pFctDestroy(pC->m_pAudioReaderContext); - pC->m_pAudioReaderContext = M4OSA_NULL; - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_CleanUp: pReaderGlobInt->m_pFctDestroy returns 0x%x", err); - /**< don't return, we have to free other components */ - } - } - - if (M4OSA_NULL != pC->m_pReaderAudioAU) - { - free(pC->m_pReaderAudioAU); - pC->m_pReaderAudioAU = M4OSA_NULL; - } - - /** - * Free video encoder stuff, if needed */ - if (M4OSA_NULL != pC->m_pMp4EncoderContext) - { - err = pC->m_pEncoderInt->pFctCleanup(pC->m_pMp4EncoderContext); - pC->m_pMp4EncoderContext = M4OSA_NULL; - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_CleanUp: pEncoderInt->pFctDestroy returns 0x%x", err); - /**< don't return, we have to free other components */ - } - } - - if (M4OSA_NULL != pC->m_pWriterVideoStream) - { - free(pC->m_pWriterVideoStream); - pC->m_pWriterVideoStream = M4OSA_NULL; - } - if (M4OSA_NULL != pC->m_pWriterAudioStream) - { - free(pC->m_pWriterAudioStream); - pC->m_pWriterAudioStream = M4OSA_NULL; - } - if (M4OSA_NULL != pC->m_pWriterVideoStreamInfo) - { - free(pC->m_pWriterVideoStreamInfo); - pC->m_pWriterVideoStreamInfo = M4OSA_NULL; - } - if (M4OSA_NULL != pC->m_pWriterAudioStreamInfo) - { - free(pC->m_pWriterAudioStreamInfo); - pC->m_pWriterAudioStreamInfo = M4OSA_NULL; - } - - - /** - * Free the shells interfaces */ - if (M4OSA_NULL != pC->m_pReaderGlobInt) - { - free(pC->m_pReaderGlobInt); - pC->m_pReaderGlobInt = M4OSA_NULL; - } - if (M4OSA_NULL != pC->m_pReaderDataInt) - { - free(pC->m_pReaderDataInt); - pC->m_pReaderDataInt = M4OSA_NULL; - } - - if(M4OSA_NULL != pC->m_pEncoderInt) - { - free(pC->m_pEncoderInt); - pC->m_pEncoderInt = M4OSA_NULL; - } - if(M4OSA_NULL != pC->m_pWriterGlobInt) - { - free(pC->m_pWriterGlobInt); - pC->m_pWriterGlobInt = M4OSA_NULL; - } - if(M4OSA_NULL != pC->m_pWriterDataInt) - { - free(pC->m_pWriterDataInt); - pC->m_pWriterDataInt = M4OSA_NULL; - } - /**< Do not free pC->pOsaMemoryPtrFct and pC->pOsaMemoryPtrFct, because it's owned by the \ - application */ - - /** - * Free the context itself */ - free(pC); - pC = M4OSA_NULL; - - M4OSA_TRACE3_0("M4PTO3GPP_CleanUp(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/********************* INTERNAL FUNCTIONS *********************/ - -/** - ****************************************************************************** - * M4OSA_ERR M4PTO3GPP_Ready4Processing(M4PTO3GPP_InternalContext* pC); - * @brief Prepare all resources and interfaces for the transcoding. - * @note It is called by the first M4OSA_Step() call - * @param pC (IN) M4PTO3GPP private context - * @return M4NO_ERROR: No error - * @return Any error returned by an underlaying module - ****************************************************************************** -*/ -/******************************************************/ -M4OSA_ERR M4PTO3GPP_Ready4Processing(M4PTO3GPP_InternalContext* pC) -/******************************************************/ -{ - M4OSA_ERR err = M4NO_ERROR; - M4WRITER_OutputFileType outputFileType; - M4OSA_UInt32 uiVersion; - M4ENCODER_Format encFormat; - M4ENCODER_AdvancedParams EncParams; /**< Encoder advanced parameters */ - M4SYS_StreamIDValue optionValue; - - M4OSA_TRACE3_1("M4PTO3GPP_Ready4Processing called with pC=0x%x", pC); - - /******************************/ - /******************************/ - - /********************************************/ - /******** ********/ - /******** Video Encoder Parames init ********/ - /******** ********/ - /********************************************/ - - /** - * Get the correct encoder interface */ - switch(pC->m_Params.OutputVideoFormat) - { - case M4VIDEOEDITING_kMPEG4: -#ifdef M4VSS_SUPPORT_ENCODER_MPEG4 - err = VideoEditorVideoEncoder_getInterface_MPEG4(&encFormat, &pC->m_pEncoderInt, - M4ENCODER_OPEN_ADVANCED); -#else /* software MPEG4 encoder not available! */ - M4OSA_TRACE1_0("No MPEG4 encoder available! Did you forget to register one?"); - err = M4ERR_STATE; -#endif /* software MPEG4 encoder available? */ - break; - case M4VIDEOEDITING_kH263: -#ifdef M4VSS_SUPPORT_ENCODER_MPEG4 - err = VideoEditorVideoEncoder_getInterface_H263(&encFormat, &pC->m_pEncoderInt, - M4ENCODER_OPEN_ADVANCED); -#else /* software H263 encoder not available! */ - M4OSA_TRACE1_0("No H263 encoder available! Did you forget to register one?"); - err = M4ERR_STATE; -#endif /* software H263 encoder available? */ - break; - case M4VIDEOEDITING_kH264: -#ifdef M4VSS_SUPPORT_ENCODER_AVC - err = VideoEditorVideoEncoder_getInterface_H264(&encFormat, &pC->m_pEncoderInt, - M4ENCODER_OPEN_ADVANCED); -#else /* software H264 encoder not available! */ - M4OSA_TRACE1_0("M4PTO3GPP_Ready4Processing: No H264 encoder available!\ - Did you forget to register one?"); - err = M4ERR_STATE; -#endif /* software H264 encoder available? */ - break; - default: - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: unknown format 0x%x returning \ - ERR_M4PTO3GPP_UNDEFINED_OUTPUT_VIDEO_FORMAT", - pC->m_Params.OutputVideoFormat); - return ERR_PTO3GPP_UNDEFINED_OUTPUT_VIDEO_FORMAT; - } - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("switch(pC->m_Params.OutputVideoFormat): getInterfaces returns 0x%x", err); - return err; - } - - /** - * Fill encoder parameters according to M4PTO3GPP settings */ - - /** - * Video frame size */ - switch(pC->m_Params.OutputVideoFrameSize) - { - case M4VIDEOEDITING_kSQCIF : - EncParams.FrameHeight = M4ENCODER_SQCIF_Height; - EncParams.FrameWidth = M4ENCODER_SQCIF_Width; - break; - case M4VIDEOEDITING_kQQVGA : - EncParams.FrameHeight = M4ENCODER_QQVGA_Height; - EncParams.FrameWidth = M4ENCODER_QQVGA_Width; - break; - case M4VIDEOEDITING_kQCIF : - EncParams.FrameHeight = M4ENCODER_QCIF_Height; - EncParams.FrameWidth = M4ENCODER_QCIF_Width; - break; - case M4VIDEOEDITING_kQVGA : - EncParams.FrameHeight = M4ENCODER_QVGA_Height; - EncParams.FrameWidth = M4ENCODER_QVGA_Width; - break; - case M4VIDEOEDITING_kCIF : - EncParams.FrameHeight = M4ENCODER_CIF_Height; - EncParams.FrameWidth = M4ENCODER_CIF_Width; - break; - case M4VIDEOEDITING_kVGA : - EncParams.FrameHeight = M4ENCODER_VGA_Height; - EncParams.FrameWidth = M4ENCODER_VGA_Width; - break; -/* +PR LV5807 */ - case M4VIDEOEDITING_kWVGA : - EncParams.FrameHeight = M4ENCODER_WVGA_Height; - EncParams.FrameWidth = M4ENCODER_WVGA_Width; - break; - case M4VIDEOEDITING_kNTSC: - EncParams.FrameHeight = M4ENCODER_NTSC_Height; - EncParams.FrameWidth = M4ENCODER_NTSC_Width; - break; -/* -PR LV5807 */ -/* +CR Google */ - case M4VIDEOEDITING_k640_360: - EncParams.FrameHeight = M4ENCODER_640_360_Height; - EncParams.FrameWidth = M4ENCODER_640_360_Width; - break; - - case M4VIDEOEDITING_k854_480: - EncParams.FrameHeight = M4ENCODER_854_480_Height; - EncParams.FrameWidth = M4ENCODER_854_480_Width; - break; - - case M4VIDEOEDITING_k1280_720: - EncParams.FrameHeight = M4ENCODER_1280_720_Height; - EncParams.FrameWidth = M4ENCODER_1280_720_Width; - break; - - case M4VIDEOEDITING_k1080_720: - EncParams.FrameHeight = M4ENCODER_1080_720_Height; - EncParams.FrameWidth = M4ENCODER_1080_720_Width; - break; - - case M4VIDEOEDITING_k960_720: - EncParams.FrameHeight = M4ENCODER_960_720_Height; - EncParams.FrameWidth = M4ENCODER_960_720_Width; - break; - - case M4VIDEOEDITING_k1920_1080: - EncParams.FrameHeight = M4ENCODER_1920_1080_Height; - EncParams.FrameWidth = M4ENCODER_1920_1080_Width; - break; -/* -CR Google */ - default : - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: unknown format 0x%x returning \ - ERR_M4PTO3GPP_UNDEFINED_OUTPUT_VIDEO_FRAME_SIZE", - pC->m_Params.OutputVideoFrameSize); - return ERR_PTO3GPP_UNDEFINED_OUTPUT_VIDEO_FRAME_SIZE; - } - - EncParams.InputFormat = M4ENCODER_kIYUV420; - - /** - * Video bitrate */ - switch(pC->m_Params.OutputVideoBitrate) - { - case M4VIDEOEDITING_k16_KBPS: - case M4VIDEOEDITING_k24_KBPS: - case M4VIDEOEDITING_k32_KBPS: - case M4VIDEOEDITING_k48_KBPS: - case M4VIDEOEDITING_k64_KBPS: - case M4VIDEOEDITING_k96_KBPS: - case M4VIDEOEDITING_k128_KBPS: - case M4VIDEOEDITING_k192_KBPS: - case M4VIDEOEDITING_k256_KBPS: - case M4VIDEOEDITING_k288_KBPS: - case M4VIDEOEDITING_k384_KBPS: - case M4VIDEOEDITING_k512_KBPS: - case M4VIDEOEDITING_k800_KBPS: -/*+ New Encoder bitrates */ - case M4VIDEOEDITING_k2_MBPS: - case M4VIDEOEDITING_k5_MBPS: - case M4VIDEOEDITING_k8_MBPS: -/*- New Encoder bitrates */ - EncParams.Bitrate = pC->m_Params.OutputVideoBitrate; - break; - - case M4VIDEOEDITING_kVARIABLE_KBPS: -/*+ New Encoder bitrates */ - EncParams.Bitrate = M4VIDEOEDITING_k8_MBPS; -/*- New Encoder bitrates */ - break; - - default : - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: unknown format 0x%x returning\ - ERR_M4PTO3GPP_UNDEFINED_OUTPUT_VIDEO_BITRATE", - pC->m_Params.OutputVideoBitrate); - return ERR_PTO3GPP_UNDEFINED_OUTPUT_VIDEO_BITRATE; - } - - /** - * Video format */ - switch(pC->m_Params.OutputVideoFormat) - { - case M4VIDEOEDITING_kMPEG4 : - EncParams.Format = M4ENCODER_kMPEG4; - break; - case M4VIDEOEDITING_kH263 : - EncParams.Format = M4ENCODER_kH263; - break; - case M4VIDEOEDITING_kH264: - EncParams.Format = M4ENCODER_kH264; - break; - default : - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: unknown format 0x%x returning\ - ERR_M4PTO3GPP_UNDEFINED_OUTPUT_VIDEO_FORMAT", - pC->m_Params.OutputVideoFormat); - return ERR_PTO3GPP_UNDEFINED_OUTPUT_VIDEO_FORMAT; - } - - /** - * Video frame rate (set it to max = 30 fps) */ - EncParams.uiTimeScale = 30; - EncParams.uiRateFactor = 1; - - EncParams.FrameRate = M4ENCODER_k30_FPS; - - - /******************************/ - /******** 3GP out init ********/ - /******************************/ - - /* Get the 3GPP writer interface */ - err = M4WRITER_3GP_getInterfaces(&outputFileType, &pC->m_pWriterGlobInt, &pC->m_pWriterDataInt); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4WRITER_3GP_getInterfaces: M4WRITER_3GP_getInterfaces returns 0x%x", err); - return err; - } - - /* Init the 3GPP writer */ - err = pC->m_pWriterGlobInt->pFctOpen(&pC->m_p3gpWriterContext, pC->m_Params.pOutput3gppFile, - pC->pOsalFileWrite, pC->m_Params.pTemporaryFile, pC->pOsalFileRead); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: pWriterGlobInt->pFctOpen returns 0x%x", err); - return err; - } - - /** - * Link to the writer context in the writer interface */ - pC->m_pWriterDataInt->pWriterContext = pC->m_p3gpWriterContext; - - /** - * Set the product description string in the written file */ - err = pC->m_pWriterGlobInt->pFctSetOption(pC->m_p3gpWriterContext, M4WRITER_kEmbeddedString, - (M4OSA_DataOption)M4PTO3GPP_SIGNATURE); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: \ - pWriterGlobInt->pFctSetOption(M4WRITER_kEmbeddedString) returns 0x%x", err); - return err; - } - - /** - * Set the product version in the written file */ - uiVersion = M4VIDEOEDITING_VERSION_MAJOR*100 + M4VIDEOEDITING_VERSION_MINOR*10 - + M4VIDEOEDITING_VERSION_REVISION; - err = pC->m_pWriterGlobInt->pFctSetOption(pC->m_p3gpWriterContext, M4WRITER_kEmbeddedVersion, - (M4OSA_DataOption)&uiVersion); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: \ - pWriterGlobInt->pFctSetOption(M4WRITER_kEmbeddedVersion) returns 0x%x", err); - return err; - } - - /** - * Allocate and fill the video stream structures for the writer */ - pC->m_pWriterVideoStream = - (M4SYS_StreamDescription*)M4OSA_32bitAlignedMalloc(sizeof(M4SYS_StreamDescription), M4PTO3GPP, - (M4OSA_Char *)"pWriterVideoStream"); - if (M4OSA_NULL == pC->m_pWriterVideoStream) - { - M4OSA_TRACE1_0("M4PTO3GPP_Ready4Processing(): unable to allocate pWriterVideoStream, \ - returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - pC->m_pWriterVideoStreamInfo = - (M4WRITER_StreamVideoInfos*)M4OSA_32bitAlignedMalloc(sizeof(M4WRITER_StreamVideoInfos), M4PTO3GPP, - (M4OSA_Char *)"pWriterVideoStreamInfo"); - if (M4OSA_NULL == pC->m_pWriterVideoStreamInfo) - { - M4OSA_TRACE1_0("M4PTO3GPP_Ready4Processing(): unable to allocate pWriterVideoStreamInfo,\ - returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - - /** - * Fill Video properties structure for the AddStream method */ - pC->m_pWriterVideoStreamInfo->height = EncParams.FrameHeight; - pC->m_pWriterVideoStreamInfo->width = EncParams.FrameWidth; - pC->m_pWriterVideoStreamInfo->fps = 0; /**< Not used by the core writer */ - pC->m_pWriterVideoStreamInfo->Header.pBuf = M4OSA_NULL; - /** No header, will be set by setOption */ - pC->m_pWriterVideoStreamInfo->Header.Size = 0; - - /** - * Fill Video stream description structure for the AddStream method */ - pC->m_pWriterVideoStream->streamID = M4PTO3GPP_WRITER_VIDEO_STREAM_ID; - - /** - * Video format */ - switch(pC->m_Params.OutputVideoFormat) - { - case M4VIDEOEDITING_kMPEG4: - pC->m_pWriterVideoStream->streamType = M4SYS_kMPEG_4; break; - case M4VIDEOEDITING_kH263: - pC->m_pWriterVideoStream->streamType = M4SYS_kH263; break; - case M4VIDEOEDITING_kH264: - pC->m_pWriterVideoStream->streamType = M4SYS_kH264; break; - default : - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: unknown format 0x%x returning \ - ERR_M4PTO3GPP_UNDEFINED_OUTPUT_VIDEO_FORMAT", - pC->m_Params.OutputVideoFormat); - return ERR_PTO3GPP_UNDEFINED_OUTPUT_VIDEO_FORMAT; - } - - /** - * Video bitrate */ - switch(pC->m_Params.OutputVideoBitrate) - { - case M4VIDEOEDITING_k16_KBPS: - case M4VIDEOEDITING_k24_KBPS: - case M4VIDEOEDITING_k32_KBPS: - case M4VIDEOEDITING_k48_KBPS: - case M4VIDEOEDITING_k64_KBPS: - case M4VIDEOEDITING_k96_KBPS: - case M4VIDEOEDITING_k128_KBPS: - case M4VIDEOEDITING_k192_KBPS: - case M4VIDEOEDITING_k256_KBPS: - case M4VIDEOEDITING_k288_KBPS: - case M4VIDEOEDITING_k384_KBPS: - case M4VIDEOEDITING_k512_KBPS: - case M4VIDEOEDITING_k800_KBPS: -/*+ New Encoder bitrates */ - case M4VIDEOEDITING_k2_MBPS: - case M4VIDEOEDITING_k5_MBPS: - case M4VIDEOEDITING_k8_MBPS: -/*- New Encoder bitrates */ - pC->m_pWriterVideoStream->averageBitrate = pC->m_Params.OutputVideoBitrate; - break; - - case M4VIDEOEDITING_kVARIABLE_KBPS : - pC->m_pWriterVideoStream->averageBitrate = 0; - break; - - default : - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: unknown format 0x%x returning\ - ERR_M4PTO3GPP_UNDEFINED_OUTPUT_VIDEO_BITRATE", - pC->m_Params.OutputVideoBitrate); - return ERR_PTO3GPP_UNDEFINED_OUTPUT_VIDEO_BITRATE; - } - - pC->m_pWriterVideoStream->duration = 0; /**< Duration is not known */ - pC->m_pWriterVideoStream->timeScale = 0; /**< Not used by the core writer */ - pC->m_pWriterVideoStream->maxBitrate = pC->m_pWriterVideoStream->averageBitrate; - pC->m_pWriterVideoStream->profileLevel = 0; /**< Not used by the core writer */ - pC->m_pWriterVideoStream->decoderSpecificInfo = (M4OSA_MemAddr32) - (pC->m_pWriterVideoStreamInfo); - pC->m_pWriterVideoStream->decoderSpecificInfoSize = sizeof(M4WRITER_StreamVideoInfos); - - /** - * Update AU properties for video stream */ - pC->m_WriterVideoAU.CTS = pC->m_WriterVideoAU.DTS = 0; /** Reset time */ - pC->m_WriterVideoAU.size = 0; - pC->m_WriterVideoAU.frag = M4OSA_NULL; - pC->m_WriterVideoAU.nbFrag = 0; /** No fragment */ - pC->m_WriterVideoAU.stream = pC->m_pWriterVideoStream; - pC->m_WriterVideoAU.attribute = AU_RAP; - pC->m_WriterVideoAU.dataAddress = M4OSA_NULL; - - /** - * If there is an audio input, allocate and fill the audio stream structures for the writer */ - if(M4OSA_NULL != pC->m_pReaderAudioStream) - { - pC->m_pWriterAudioStream = - (M4SYS_StreamDescription*)M4OSA_32bitAlignedMalloc(sizeof(M4SYS_StreamDescription), M4PTO3GPP, - (M4OSA_Char *)"pWriterAudioStream"); - if (M4OSA_NULL == pC->m_pWriterAudioStream) - { - M4OSA_TRACE1_0("M4PTO3GPP_Ready4Processing(): unable to allocate pWriterAudioStream, \ - returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - pC->m_pWriterAudioStreamInfo = - (M4WRITER_StreamAudioInfos*)M4OSA_32bitAlignedMalloc(sizeof(M4WRITER_StreamAudioInfos), M4PTO3GPP, - (M4OSA_Char *)"pWriterAudioStreamInfo"); - if (M4OSA_NULL == pC->m_pWriterAudioStreamInfo) - { - M4OSA_TRACE1_0("M4PTO3GPP_Ready4Processing(): unable to allocate \ - pWriterAudioStreamInfo, returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - - pC->m_pWriterAudioStreamInfo->nbSamplesPerSec = 0; /**< unused by our shell writer */ - pC->m_pWriterAudioStreamInfo->nbBitsPerSample = 0; /**< unused by our shell writer */ - pC->m_pWriterAudioStreamInfo->nbChannels = 1; /**< unused by our shell writer */ - - if( (M4OSA_NULL != pC->m_pReaderAudioStream) && /* audio could have been discarded */ - (M4OSA_NULL != pC->m_pReaderAudioStream->m_basicProperties.m_pDecoderSpecificInfo) ) - { - /* If we copy the stream from the input, we copy its DSI */ - pC->m_pWriterAudioStreamInfo->Header.Size = - pC->m_pReaderAudioStream->m_basicProperties.m_decoderSpecificInfoSize; - pC->m_pWriterAudioStreamInfo->Header.pBuf = - (M4OSA_MemAddr8)pC->m_pReaderAudioStream->m_basicProperties.m_pDecoderSpecificInfo; - } - else - { - /* Writer will put a default DSI */ - pC->m_pWriterAudioStreamInfo->Header.Size = 0; - pC->m_pWriterAudioStreamInfo->Header.pBuf = M4OSA_NULL; - } - - /** - * Add the audio stream */ - switch (pC->m_pReaderAudioStream->m_basicProperties.m_streamType) - { - case M4DA_StreamTypeAudioAmrNarrowBand: - pC->m_pWriterAudioStream->streamType = M4SYS_kAMR; - break; - case M4DA_StreamTypeAudioAac: - pC->m_pWriterAudioStream->streamType = M4SYS_kAAC; - break; - case M4DA_StreamTypeAudioEvrc: - pC->m_pWriterAudioStream->streamType = M4SYS_kEVRC; - break; - default: - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: unhandled audio format (0x%x),\ - returning ERR_PTO3GPP_UNDEFINED_OUTPUT_VIDEO_BITRATE", - pC->m_pReaderAudioStream->m_basicProperties.m_streamType); - return ERR_PTO3GPP_UNDEFINED_OUTPUT_AUDIO_FORMAT; - } - - /* - * Fill Audio stream description structure for the AddStream method */ - pC->m_pWriterAudioStream->streamID = M4PTO3GPP_WRITER_AUDIO_STREAM_ID; - pC->m_pWriterAudioStream->duration = 0;/**< Duration is not known yet */ - pC->m_pWriterAudioStream->timeScale = M4PTO3GPP_WRITER_AUDIO_AMR_TIME_SCALE; - pC->m_pWriterAudioStream->profileLevel = M4PTO3GPP_WRITER_AUDIO_PROFILE_LEVEL; - pC->m_pWriterAudioStream->averageBitrate = - pC->m_pReaderAudioStream->m_basicProperties.m_averageBitRate; - pC->m_pWriterAudioStream->maxBitrate = - pC->m_pWriterAudioStream->averageBitrate; - - /** - * Our writer shell interface is a little tricky: we put M4WRITER_StreamAudioInfos \ - in the DSI pointer... */ - pC->m_pWriterAudioStream->decoderSpecificInfo = - (M4OSA_MemAddr32)pC->m_pWriterAudioStreamInfo; - - /** - * Update AU properties for audio stream */ - pC->m_WriterAudioAU.CTS = pC->m_WriterAudioAU.DTS = 0; /** Reset time */ - pC->m_WriterAudioAU.size = 0; - pC->m_WriterAudioAU.frag = M4OSA_NULL; - pC->m_WriterAudioAU.nbFrag = 0; /** No fragment */ - pC->m_WriterAudioAU.stream = pC->m_pWriterAudioStream; - pC->m_WriterAudioAU.attribute = AU_RAP; - pC->m_WriterAudioAU.dataAddress = M4OSA_NULL; - } - - /************************************/ - /******** Video Encoder Init ********/ - /************************************/ - - /** - * PTO uses its own bitrate regulation, not the "true" core regulation */ - EncParams.bInternalRegulation = M4OSA_TRUE; //M4OSA_FALSE; - EncParams.uiStartingQuantizerValue = M4PTO3GPP_QUANTIZER_STEP; - - EncParams.videoProfile = pC->m_Params.videoProfile; - EncParams.videoLevel = pC->m_Params.videoLevel; - - /** - * Other encoder settings */ - - EncParams.uiHorizontalSearchRange = 0; /* use default */ - EncParams.uiVerticalSearchRange = 0; /* use default */ - EncParams.bErrorResilience = M4OSA_FALSE; /* no error resilience */ - EncParams.uiIVopPeriod = 15; /* use default */ - EncParams.uiMotionEstimationTools = 0; /* M4V_MOTION_EST_TOOLS_ALL */ - EncParams.bAcPrediction = M4OSA_TRUE; /* use AC prediction */ - EncParams.bDataPartitioning = M4OSA_FALSE; /* no data partitioning */ - - - /** - * Create video encoder */ - err = pC->m_pEncoderInt->pFctInit(&pC->m_pMp4EncoderContext, pC->m_pWriterDataInt, - M4PTO3GPP_applyVPP, pC, pC->m_pEncoderExternalAPI, - pC->m_pEncoderUserData); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: EncoderInt->pFctInit returns 0x%x", err); - return err; - } - - pC->m_eEncoderState = M4PTO3GPP_kEncoderClosed; - - err = pC->m_pEncoderInt->pFctOpen(pC->m_pMp4EncoderContext, &pC->m_WriterVideoAU, &EncParams); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: EncoderInt->pFctOpen returns 0x%x", err); - return err; - } - - pC->m_eEncoderState = M4PTO3GPP_kEncoderStopped; - - if (M4OSA_NULL != pC->m_pEncoderInt->pFctStart) - { - err = pC->m_pEncoderInt->pFctStart(pC->m_pMp4EncoderContext); - - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: EncoderInt->pFctStart returns 0x%x", err); - return err; - } - } - - pC->m_eEncoderState = M4PTO3GPP_kEncoderRunning; - - /** - * No more setoption on "M4ENCODER_kVideoFragmentSize" here. - * It is now automaticly and "smartly" set in the encoder shell. */ - - /**************************************/ - /******** 3GP out add streams ********/ - /**************************************/ - - err = pC->m_pWriterGlobInt->pFctAddStream(pC->m_p3gpWriterContext, pC->m_pWriterVideoStream); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: pWriterGlobInt->pFctAddStream(video) returns\ - 0x%x", err); - return err; - } - - /** - * Set video max au size */ - optionValue.streamID = M4PTO3GPP_WRITER_VIDEO_STREAM_ID; - optionValue.value = (M4OSA_UInt32)(1.5F * (M4OSA_Float)(pC->m_pWriterVideoStreamInfo->width - * pC->m_pWriterVideoStreamInfo->height) - * M4PTO3GPP_VIDEO_MIN_COMPRESSION_RATIO); - M4OSA_TRACE3_1("M4PTO3GPP_Ready4Processing,M4WRITER_kMaxAUSize: %u",optionValue.value); - err = pC->m_pWriterGlobInt->pFctSetOption(pC->m_p3gpWriterContext, - (M4OSA_UInt32)M4WRITER_kMaxAUSize,(M4OSA_DataOption) &optionValue); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: pWriterGlobInt->pFctSetOption(video,\ - M4WRITER_kMaxAUSize) returns 0x%x", err); - return err; - } - - /** - * Set video max chunck size */ - optionValue.value = (M4OSA_UInt32)((M4OSA_Float)optionValue.value - * M4PTO3GPP_VIDEO_AU_SIZE_TO_CHUNCK_SIZE_RATIO); - M4OSA_TRACE3_1("M4PTO3GPP_Ready4Processing,M4WRITER_kMaxChunckSize: %u",optionValue.value); - err = pC->m_pWriterGlobInt->pFctSetOption(pC->m_p3gpWriterContext, - (M4OSA_UInt32)M4WRITER_kMaxChunckSize,(M4OSA_DataOption) &optionValue); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: pWriterGlobInt->pFctSetOption(video,\ - M4WRITER_kMaxChunckSize) returns 0x%x", err); - return err; - } - - if (M4OSA_NULL != pC->m_pReaderAudioStream) - { - err = pC->m_pWriterGlobInt->pFctAddStream(pC->m_p3gpWriterContext, pC->m_pWriterAudioStream); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: pWriterGlobInt->pFctAddStream(audio) \ - returns 0x%x", err); - return err; - } - - /** - * Set audio max au size */ - optionValue.value = M4PTO3GPP_AUDIO_MAX_AU_SIZE; - optionValue.streamID = M4PTO3GPP_WRITER_AUDIO_STREAM_ID; - err = pC->m_pWriterGlobInt->pFctSetOption(pC->m_p3gpWriterContext, - (M4OSA_UInt32)M4WRITER_kMaxAUSize,(M4OSA_DataOption) &optionValue); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: pWriterGlobInt->pFctSetOption(audio,\ - M4WRITER_kMaxAUSize) returns 0x%x", err); - return err; - } - - /** - * Set audio max chunck size */ - optionValue.value = M4PTO3GPP_AUDIO_MAX_CHUNK_SIZE; /**< Magical */ - err = pC->m_pWriterGlobInt->pFctSetOption(pC->m_p3gpWriterContext, - (M4OSA_UInt32)M4WRITER_kMaxChunckSize,(M4OSA_DataOption) &optionValue); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: pWriterGlobInt->pFctSetOption(audio,\ - M4WRITER_kMaxChunckSize) returns 0x%x", err); - return err; - } - } - - /* - * Close the stream registering in order to be ready to write data */ - err = pC->m_pWriterGlobInt->pFctStartWriting(pC->m_p3gpWriterContext); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_Ready4Processing: pWriterGlobInt->pFctStartWriting returns 0x%x", - err); - return err; - } - - - M4OSA_TRACE3_0("M4PTO3GPP_Ready4Processing: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - M4OSA_ERR M4PTO3GPP_writeAmrSilence122Frame(M4WRITER_DataInterface* pWriterDataIntInterface, - M4WRITER_Context* pWriterContext, - M4SYS_AccessUnit* pWriterAudioAU, M4OSA_Time mtIncCts) - * @brief Write an AMR 12.2kbps silence FRAME into the writer - * @note Mainly used to fix the 'bzz' bug... - * @param pWriterDataIntInterface (IN) writer data interfaces - * pWriterContext (IN/OUT)writer context - * pWriterAudioAU (OUT) writer audio access unit - * mtIncCts (IN) writer CTS - * @return M4NO_ERROR: No error - ****************************************************************************** -*/ -static M4OSA_ERR M4PTO3GPP_writeAmrSilence122Frame(M4WRITER_DataInterface* pWriterDataIntInterface, - M4WRITER_Context* pWriterContext, - M4SYS_AccessUnit* pWriterAudioAU, - M4OSA_Time mtIncCts) -{ - M4OSA_ERR err; - - err = pWriterDataIntInterface->pStartAU(pWriterContext, M4PTO3GPP_WRITER_AUDIO_STREAM_ID, - pWriterAudioAU); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_writeAmrSilence122Frame: pWriterDataInt->pStartAU(audio) returns \ - 0x%x!", err); - return err; - } - - memcpy((void *)pWriterAudioAU->dataAddress, - (void *)M4PTO3GPP_AMR_AU_SILENCE_122_FRAME, M4PTO3GPP_AMR_AU_SILENCE_FRAME_122_SIZE); - pWriterAudioAU->size = M4PTO3GPP_AMR_AU_SILENCE_FRAME_122_SIZE; - pWriterAudioAU->CTS = mtIncCts; - pWriterAudioAU->nbFrag = 0; - - err = pWriterDataIntInterface->pProcessAU(pWriterContext, M4PTO3GPP_WRITER_AUDIO_STREAM_ID, - pWriterAudioAU); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_writeAmrSilence122Frame: pWriterDataInt->pProcessAU(silence) \ - returns 0x%x!", err); - return err; - } - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - M4OSA_ERR M4PTO3GPP_writeAmrSilence048Frame(M4WRITER_DataInterface* pWriterDataIntInterface, - M4WRITER_Context* pWriterContext, - M4SYS_AccessUnit* pWriterAudioAU, M4OSA_Time mtIncCts) - * @brief Write an AMR 12.2kbps silence FRAME into the writer - * @note Mainly used to fix the 'bzz' bug... - * @param pWriterDataIntInterface (IN) writer data interfaces - * pWriterContext (IN/OUT)writer context - * pWriterAudioAU (OUT) writer audio access unit - * mtIncCts (IN) writer CTS - * @return M4NO_ERROR: No error - ****************************************************************************** -*/ -static M4OSA_ERR M4PTO3GPP_writeAmrSilence048Frame(M4WRITER_DataInterface* pWriterDataIntInterface, - M4WRITER_Context* pWriterContext, - M4SYS_AccessUnit* pWriterAudioAU, - M4OSA_Time mtIncCts) -{ - M4OSA_ERR err; - - err = pWriterDataIntInterface->pStartAU(pWriterContext, M4PTO3GPP_WRITER_AUDIO_STREAM_ID, - pWriterAudioAU); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_writeAmrSilence048Frame: pWriterDataInt->pStartAU(audio)\ - returns 0x%x!", err); - return err; - } - - memcpy((void *)pWriterAudioAU->dataAddress, - (void *)M4PTO3GPP_AMR_AU_SILENCE_048_FRAME, - M4PTO3GPP_AMR_AU_SILENCE_FRAME_048_SIZE); - pWriterAudioAU->size = M4PTO3GPP_AMR_AU_SILENCE_FRAME_048_SIZE; - pWriterAudioAU->CTS = mtIncCts; - pWriterAudioAU->nbFrag = 0; - - err = pWriterDataIntInterface->pProcessAU(pWriterContext, - M4PTO3GPP_WRITER_AUDIO_STREAM_ID, pWriterAudioAU); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4PTO3GPP_writeAmrSilence048Frame: \ - pWriterDataInt->pProcessAU(silence) returns 0x%x!", err); - return err; - } - - return M4NO_ERROR; -} - - diff --git a/libvideoeditor/vss/src/M4PTO3GPP_VideoPreProcessing.c b/libvideoeditor/vss/src/M4PTO3GPP_VideoPreProcessing.c deleted file mode 100755 index 96a6498..0000000 --- a/libvideoeditor/vss/src/M4PTO3GPP_VideoPreProcessing.c +++ /dev/null @@ -1,139 +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 M4PTO3GPP_VideoPreProcessing.c - * @brief Picture to 3gpp Service video preprocessing management. - ****************************************************************************** - */ - -/** - * OSAL Debug utilities */ -#include "M4OSA_Debug.h" - -/** - * OSAL Memory management */ -#include "M4OSA_Memory.h" - -/** - * Definition of the M4PTO3GPP internal context */ -#include "M4PTO3GPP_InternalTypes.h" - -/** - * Definition of the M4PTO3GPP errors */ -#include "M4PTO3GPP_ErrorCodes.h" - -/* If time increment is too low then we have an infinite alloc loop into M4ViEncCaptureFrame() */ -/* Time increment should match 30 fps maximum */ -#define M4PTO3GPP_MIN_TIME_INCREMENT 33.3333334 - - -/** - ****************************************************************************** - * M4OSA_ERR M4PTO3GPP_applyVPP(M4VPP_Context pContext, M4VIFI_ImagePlane* pPlaneIn, - * M4VIFI_ImagePlane* pPlaneOut) - * @brief Call an external callback to get the picture to encode - * @note It is called by the video encoder - * @param pContext (IN) VPP context, which actually is the M4PTO3GPP internal context - * in our case - * @param pPlaneIn (IN) Contains the image - * @param pPlaneOut (IN/OUT) Pointer to an array of 3 planes that will contain the - * output YUV420 image read with the m_pPictureCallbackFct - * @return M4NO_ERROR: No error - * @return Any error returned by an underlaying module - ****************************************************************************** - */ -/******************************************************/ -M4OSA_ERR M4PTO3GPP_applyVPP(M4VPP_Context pContext, M4VIFI_ImagePlane* pPlaneIn, - M4VIFI_ImagePlane* pPlaneOut) -/******************************************************/ -{ - M4OSA_ERR err; - M4OSA_Double mtDuration; - M4OSA_UInt32 i; - - /*** NOTE ***/ - /* It's OK to get pPlaneIn == M4OSA_NULL here */ - /* since it has been given NULL in the pFctEncode() call. */ - /* It's because we use the M4PTO3GPP internal context to */ - /* transmit the encoder input data. */ - /* The input data is the image read from the m_pPictureCallbackFct */ - - /** - * The VPP context is actually the M4PTO3GPP context! */ - M4PTO3GPP_InternalContext *pC = (M4PTO3GPP_InternalContext*)(pContext); - - /** - * Get the picture to encode */ - if (M4OSA_FALSE == pC->m_bLastInternalCallBack) - { - err = pC->m_Params.pPictureCallbackFct(pC->m_Params.pPictureCallbackCtxt, pPlaneOut, - &mtDuration); - - /* In case of error when getting YUV to encode (ex: error when decoding a JPEG) */ - if((M4NO_ERROR != err) && (((M4OSA_UInt32)M4PTO3GPP_WAR_LAST_PICTURE) != err)) - { - return err; - } - - /** - * If end of encoding is asked by the size limitation system, - * we must end the encoding the same way that when it is asked by the - * picture callback (a.k.a. the integrator). - * Thus we simulate the LastPicture code return: */ - if (M4OSA_TRUE == pC->m_IsLastPicture) - { - err = M4PTO3GPP_WAR_LAST_PICTURE; - } - - if(((M4OSA_UInt32)M4PTO3GPP_WAR_LAST_PICTURE) == err) - { - pC->m_bLastInternalCallBack = M4OSA_TRUE; /* Toggle flag for the final call of the CB*/ - pC->m_IsLastPicture = M4OSA_TRUE; /* To stop the encoder */ - pC->pSavedPlane = pPlaneOut; /* Save the last YUV plane ptr */ - pC->uiSavedDuration = (M4OSA_UInt32)mtDuration; /* Save the last duration */ - } - } - else - { - /**< Not necessary here because the last frame duration is set to the-last-but-one by - the light writer */ - /**< Only necessary for pC->m_mtNextCts below...*/ - mtDuration = pC->uiSavedDuration; - - - /** Copy the last YUV plane into the current one - * (the last pic is splited due to the callback extra-call... */ - for (i=0; i<3; i++) - { - memcpy((void *)pPlaneOut[i].pac_data, - (void *)pC->pSavedPlane[i].pac_data, - pPlaneOut[i].u_stride * pPlaneOut[i].u_height); - } - } - - /* TimeIncrement should be 30 fps maximum */ - if(mtDuration < M4PTO3GPP_MIN_TIME_INCREMENT) - { - mtDuration = M4PTO3GPP_MIN_TIME_INCREMENT; - } - - pC->m_mtNextCts += mtDuration; - - M4OSA_TRACE3_0("M4PTO3GPP_applyVPP: returning M4NO_ERROR"); - return M4NO_ERROR; -} - diff --git a/libvideoeditor/vss/src/M4READER_Amr.c b/libvideoeditor/vss/src/M4READER_Amr.c deleted file mode 100755 index 71f0e28..0000000 --- a/libvideoeditor/vss/src/M4READER_Amr.c +++ /dev/null @@ -1,790 +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_Amr.c - * @brief Generic encapsulation of the core amr reader - * @note This file implements the generic M4READER interface - * on top of the AMR reader - ************************************************************************ -*/ -#include "M4OSA_Types.h" -#include "M4OSA_Error.h" -#include "M4OSA_Memory.h" -#include "M4OSA_Debug.h" -#include "M4OSA_CoreID.h" - -#include "M4_Utils.h" - -#include "M4AMRR_CoreReader.h" -#include "M4READER_Amr.h" - -/** - ************************************************************************ - * structure M4READER_AMR_Context - * @brief This structure defines the internal context of a amr reader instance - * @note The context is allocated and de-allocated by the reader - ************************************************************************ -*/ -typedef struct _M4READER_AMR_Context -{ - M4OSA_Context m_pCoreContext; /**< core amr reader context */ - M4_AudioStreamHandler* 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_Time m_maxDuration; /**< duration of the audio stream */ - M4OSA_FileReadPointer* m_pOsaFileReaderFcts; /**< OSAL file read functions */ - -} M4READER_AMR_Context; - - -/** - ************************************************************************ - * @brief create an instance of the reader - * @note allocates the context - * @param pContext: (OUT) pointer on a 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_AMR_create(M4OSA_Context *pContext) -{ - M4READER_AMR_Context* pReaderContext; - - /* Check function parameters */ - M4OSA_DEBUG_IF1((pContext == 0), M4ERR_PARAMETER, - "M4READER_AMR_create: invalid context pointer"); - - pReaderContext = (M4READER_AMR_Context*)M4OSA_32bitAlignedMalloc(sizeof(M4READER_AMR_Context), - M4READER_AMR, (M4OSA_Char *)"M4READER_AMR_Context"); - if (pReaderContext == M4OSA_NULL) - { - return M4ERR_ALLOC; - } - - pReaderContext->m_pAudioStream = M4OSA_NULL; - pReaderContext->m_audioAu.dataAddress = M4OSA_NULL; - pReaderContext->m_maxDuration = 0; - pReaderContext->m_pCoreContext = M4OSA_NULL; - pReaderContext->m_pOsaFileReaderFcts = M4OSA_NULL; - - *pContext = pReaderContext; - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * @brief destroy the instance of the reader - * @note after this call the context is invalid - * - * @param context: (IN) Context of the reader - * - * @return M4NO_ERROR there is no error - * @return M4ERR_PARAMETER at least one parameter is not properly set - ************************************************************************ -*/ -M4OSA_ERR M4READER_AMR_destroy(M4OSA_Context context) -{ - M4READER_AMR_Context* pC=(M4READER_AMR_Context*)context; - - /* Check function parameters*/ - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "M4READER_AMR_destroy: invalid context pointer"); - - /** - * Check input parameter */ - if (M4OSA_NULL == pC) - { - M4OSA_TRACE1_0("M4READER_AMR_destroy(): M4READER_AMR_destroy: context is M4OSA_NULL,\ - returning M4ERR_PARAMETER"); - return M4ERR_PARAMETER; - } - - free(pC); - - return M4NO_ERROR; -} - - -/** - ************************************************************************ - * @brief open the reader and initializes its created instance - * @note this function opens the AMR file - * @param context: (IN) Context of the reader - * @param pFileDescriptor: (IN) Pointer to proprietary data identifying the media to open - * @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_AMR_open(M4OSA_Context context, M4OSA_Void* pFileDescriptor) -{ - M4READER_AMR_Context* pC = (M4READER_AMR_Context*)context; - M4OSA_ERR err; - - /* Check function parameters*/ - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "M4READER_AMR_open: invalid context pointer"); - M4OSA_DEBUG_IF1((M4OSA_NULL == pFileDescriptor), M4ERR_PARAMETER, - "M4READER_AMR_open: invalid pointer pFileDescriptor"); - - err = M4AMRR_openRead( &pC->m_pCoreContext, 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_AMR_close(M4OSA_Context context) -{ - M4READER_AMR_Context* pC = (M4READER_AMR_Context*)context; - M4OSA_ERR err; - M4AMRR_State State; - - /* Check function parameters*/ - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "M4READER_AMR_close: invalid context pointer"); - - /** - * Check input parameter */ - if (M4OSA_NULL == pC) - { - M4OSA_TRACE1_0("M4READER_AMR_close(): M4READER_AMR_close: context is M4OSA_NULL,\ - returning M4ERR_PARAMETER"); - return M4ERR_PARAMETER; - } - - if (M4OSA_NULL != pC->m_pAudioStream) - { - err = M4AMRR_getState(pC->m_pCoreContext, &State, - ((M4_StreamHandler*)pC->m_pAudioStream)->m_streamId); - if(M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4READER_AMR_close: error when calling M4AMRR_getState\n"); - return err; - } - - if (M4AMRR_kReading_nextAU == State) - { - err = M4AMRR_freeAU(pC->m_pCoreContext, - ((M4_StreamHandler*)pC->m_pAudioStream)->m_streamId, &pC->m_audioAu); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_0("M4READER_AMR_close: error when freeing access unit\n"); - return err; - } - } - - /* Delete the DSI if needed */ - if(M4OSA_NULL != pC->m_pAudioStream->m_basicProperties.m_pDecoderSpecificInfo) - { - free(\ - pC->m_pAudioStream->m_basicProperties.m_pDecoderSpecificInfo); - - pC->m_pAudioStream->m_basicProperties.m_decoderSpecificInfoSize = 0; - pC->m_pAudioStream->m_basicProperties.m_pDecoderSpecificInfo = M4OSA_NULL; - } - - /* Finally destroy the stream handler */ - free(pC->m_pAudioStream); - pC->m_pAudioStream = M4OSA_NULL; - } - - if (M4OSA_NULL != pC->m_pCoreContext) - { - err = M4AMRR_closeRead(pC->m_pCoreContext); - pC->m_pCoreContext = M4OSA_NULL; - } - - return err; -} - -/** - ************************************************************************ - * @brief Get the next stream found in the media - * @note current version needs to translate M4SYS_Stream to M4_StreamHandler - * - * @param context: (IN) Context of the reader - * @param pMediaFamily: (OUT) pointer to a user allocated M4READER_MediaFamily - * that will be filled with the media family of the found stream - * @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 M4WAR_NO_MORE_STREAM no more available stream in the media (all streams found) - * @return M4ERR_PARAMETER at least one parameter is not properly set (in DEBUG mode only) - ************************************************************************ -*/ -M4OSA_ERR M4READER_AMR_getNextStream(M4OSA_Context context, M4READER_MediaFamily *pMediaFamily, - M4_StreamHandler **pStreamHandlerParam) -{ - M4READER_AMR_Context* pC=(M4READER_AMR_Context*)context; - M4OSA_ERR err; - M4SYS_StreamID streamIdArray[2]; - M4SYS_StreamDescription streamDesc; - M4_AudioStreamHandler* pAudioStreamHandler; - M4_StreamHandler* pStreamHandler; - - M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, - "M4READER_AMR_getNextStream: invalid context"); - M4OSA_DEBUG_IF1((pMediaFamily == 0), M4ERR_PARAMETER, - "M4READER_AMR_getNextStream: invalid pointer to MediaFamily"); - M4OSA_DEBUG_IF1((pStreamHandlerParam == 0), M4ERR_PARAMETER, - "M4READER_AMR_getNextStream: invalid pointer to StreamHandler"); - - err = M4AMRR_getNextStream( pC->m_pCoreContext, &streamDesc); - if (err == M4WAR_NO_MORE_STREAM) - { - streamIdArray[0] = 0; - streamIdArray[1] = 0; - err = M4AMRR_startReading(pC->m_pCoreContext, streamIdArray); - if ((M4OSA_UInt32)M4ERR_ALLOC == err) - { - M4OSA_TRACE2_0("M4READER_AMR_getNextStream: M4AMRR_startReading returns M4ERR_ALLOC!"); - return err; - } - return M4WAR_NO_MORE_STREAM; - } - else if (err != M4NO_ERROR) - { - return err; - } - - *pMediaFamily = M4READER_kMediaFamilyAudio; - - pAudioStreamHandler = (M4_AudioStreamHandler*)M4OSA_32bitAlignedMalloc(sizeof(M4_AudioStreamHandler), - M4READER_AMR, (M4OSA_Char *)"M4_AudioStreamHandler"); - if (pAudioStreamHandler == M4OSA_NULL) - { - return M4ERR_ALLOC; - } - pStreamHandler =(M4_StreamHandler*)(pAudioStreamHandler); - *pStreamHandlerParam = pStreamHandler; - pC->m_pAudioStream = pAudioStreamHandler; - - pAudioStreamHandler->m_structSize = sizeof(M4_AudioStreamHandler); - - /* - * Audio stream handler fields are initialised with 0 value. - * They will be properly set by the AMR decoder - */ - pAudioStreamHandler->m_samplingFrequency = 0; - pAudioStreamHandler->m_byteFrameLength = 0; - pAudioStreamHandler->m_byteSampleSize = 0; - pAudioStreamHandler->m_nbChannels = 0; - - pStreamHandler->m_pDecoderSpecificInfo = (M4OSA_UInt8*)(streamDesc.decoderSpecificInfo); - pStreamHandler->m_decoderSpecificInfoSize = streamDesc.decoderSpecificInfoSize; - pStreamHandler->m_streamId = streamDesc.streamID; - pStreamHandler->m_duration = streamDesc.duration; - pStreamHandler->m_pUserData = (void*)(intptr_t)streamDesc.timeScale; /*trick to change*/ - - if (streamDesc.duration > pC->m_maxDuration) - { - pC->m_maxDuration = streamDesc.duration; - } - pStreamHandler->m_averageBitRate = streamDesc.averageBitrate; - - M4AMRR_getmaxAUsize(pC->m_pCoreContext, &pStreamHandler->m_maxAUSize); - - switch (streamDesc.streamType) - { - case M4SYS_kAMR: - pStreamHandler->m_streamType = M4DA_StreamTypeAudioAmrNarrowBand; - break; - case M4SYS_kAMR_WB: - pStreamHandler->m_streamType = M4DA_StreamTypeAudioAmrWideBand; - break; - default: - break; - } - - return err; -} - -/** - ************************************************************************ - * @brief fill the access unit structure with initialization values - * @note - * @param context: (IN) Context of the reader - * @param pStreamHandler: (IN) pointer to the stream handler to - * which the access unit will be associated - * @param pAccessUnit: (IN/OUT) 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 - ************************************************************************ -*/ -M4OSA_ERR M4READER_AMR_fillAuStruct(M4OSA_Context context, M4_StreamHandler *pStreamHandler, - M4_AccessUnit *pAccessUnit) -{ - M4READER_AMR_Context* pC = (M4READER_AMR_Context*)context; - M4SYS_AccessUnit* pAu; - - M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, - "M4READER_AMR_fillAuStruct: invalid context"); - M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, - "M4READER_AMR_fillAuStruct: invalid pointer to M4_StreamHandler"); - M4OSA_DEBUG_IF1((pAccessUnit == 0), M4ERR_PARAMETER, - "M4READER_AMR_fillAuStruct: invalid pointer to M4_AccessUnit"); - - if (pStreamHandler == (M4_StreamHandler*)pC->m_pAudioStream) - { - pAu = &pC->m_audioAu; - } - else - { - M4OSA_TRACE1_0("M4READER_AMR_fillAuStruct: passed StreamHandler is not known\n"); - return M4ERR_PARAMETER; - } - - pAu->dataAddress = M4OSA_NULL; - pAu->size = 0; - /* JC: bug fix 1197 (set CTS to -20 in order the first AU CTS is 0) */ - pAu->CTS = -20; - pAu->DTS = -20; - pAu->attribute = 0; - pAu->nbFrag = 0; - - pAccessUnit->m_size = 0; - /* JC: bug fix 1197 (set CTS to -20 in order the first AU CTS is 0) */ - pAccessUnit->m_CTS = -20; - pAccessUnit->m_DTS = -20; - 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 get an option value from the reader - * @note this function follows the set/get option mechanism described in OSAL 3.0 - * it allows the caller to retrieve a property value: - * - the duration of the longest stream of the media - * - the version number of the reader (not implemented yet) - * - * @param context: (IN) Context of the reader - * @param optionId: (IN) indicates the option to get - * @param pValue: (OUT) pointer to structure or value (allocated by user) - * where option is stored - * - * @return M4NO_ERROR there is no error - * @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_AMR_getOption(M4OSA_Context context, M4OSA_OptionID optionId, - M4OSA_DataOption pValue) - -{ - M4READER_AMR_Context* pC = (M4READER_AMR_Context*)context; - M4OSA_ERR err = M4NO_ERROR; - - /* Check function parameters */ - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, "invalid context pointer"); - M4OSA_DEBUG_IF1((M4OSA_NULL == pValue), M4ERR_PARAMETER, "invalid value pointer"); - - switch(optionId) - { - case M4READER_kOptionID_Duration : - { - *(M4OSA_Time*)pValue = pC->m_maxDuration; - } - break; - - case M4READER_kOptionID_Bitrate: - { - M4OSA_UInt32* pBitrate = (M4OSA_UInt32*)pValue; - if (M4OSA_NULL != pC->m_pAudioStream) - { - *pBitrate = pC->m_pAudioStream->m_basicProperties.m_averageBitRate; - } - else - { - pBitrate = 0; - err = M4ERR_PARAMETER; - } - - } - break; - case M4READER_kOptionID_Version: - { - err = M4AMRR_getVersion((M4_VersionInfo*)pValue); - } - break; - - default : - { - err = M4ERR_PARAMETER; - } - } - - return err; -} - -/** - ************************************************************************ - * @brief set en option value of the readder - * @note this function follows the set/get option mechanism described in OSAL 3.0 - * it allows the caller to set a property value: - * - the OSAL file read functions - * - * @param context: (IN) Context of the decoder - * @param optionId: (IN) Identifier indicating 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_OPTION_ID The option ID is not a valid one - * @return M4ERR_STATE State automaton is not applied - * @return M4ERR_PARAMETER The option parameter is invalid - ************************************************************************ -*/ -M4OSA_ERR M4READER_AMR_setOption(M4OSA_Context context, M4OSA_OptionID optionId, - M4OSA_DataOption pValue) -{ - M4READER_AMR_Context* pC = (M4READER_AMR_Context*)context; - M4OSA_ERR err = M4NO_ERROR; - - /* Check function parameters */ - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, "invalid context pointer"); - M4OSA_DEBUG_IF1((M4OSA_NULL == pValue), M4ERR_PARAMETER, "invalid value pointer"); - - switch(optionId) - { - case M4READER_kOptionID_SetOsaFileReaderFctsPtr : - { - pC->m_pOsaFileReaderFcts = (M4OSA_FileReadPointer*)pValue; - } - break; - default : - { - err = M4ERR_PARAMETER; - } - } - - return err; -} - -/** - ************************************************************************ - * @brief reset the stream, that is seek it to beginning and make it ready to be read - * @note this function is to be deprecated in next versions - * - * @param context: (IN) Context of the reader - * @param pStreamHandler (IN) The stream handler of the stream to reset - * - * @return M4NO_ERROR there is no error - * @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 - * @return M4ERR_STATE this function cannot be called now - * @return M4ERR_BAD_CONTEXT provided context is not a valid one - * @return M4WAR_INVALID_TIME beginning of the stream can not be reached - ************************************************************************ -*/ -M4OSA_ERR M4READER_AMR_reset(M4OSA_Context context, M4_StreamHandler *pStreamHandler) -{ - M4READER_AMR_Context* pC = (M4READER_AMR_Context*)context; - M4SYS_StreamID streamIdArray[2]; - M4OSA_ERR err; - M4SYS_AccessUnit* pAu; - M4OSA_Time time64 = 0; - M4AMRR_State State; - - M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, "M4READER_AMR_reset: invalid context"); - M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, - "M4READER_AMR_reset: invalid pointer to M4_StreamHandler"); - - if (pStreamHandler == (M4_StreamHandler*)pC->m_pAudioStream) - { - pAu = &pC->m_audioAu; - } - else - { - M4OSA_TRACE1_0("M4READER_AMR_reset: passed StreamHandler is not known\n"); - return M4ERR_PARAMETER; - } - - err = M4AMRR_getState(pC->m_pCoreContext, &State, pStreamHandler->m_streamId); - if (M4AMRR_kReading_nextAU == State) - { - err = M4AMRR_freeAU(pC->m_pCoreContext, pStreamHandler->m_streamId, pAu); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_0("M4READER_AMR_reset: error when freeing access unit\n"); - return err; - } - pAu->dataAddress = M4OSA_NULL; - } - - streamIdArray[0] = pStreamHandler->m_streamId; - streamIdArray[1] = 0; - - err = M4NO_ERROR; - - /* for reset during playback */ - /* (set CTS to -20 in order the first AU CTS is 0) */ - pAu->CTS = -20; - pAu->DTS = -20; - - err = M4AMRR_seek(pC->m_pCoreContext, streamIdArray, time64, M4SYS_kBeginning, &time64); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_0("M4READER_AMR_reset: error when calling M4AMRR_seek()\n"); - return err; - } - - return err; -} - -/** - ************************************************************************ - * @brief jump into the stream at the specified time - * @note - * @param context: (IN) Context of the reader - * @param pStreamHandler (IN) the stream description 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 - * @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 M4WAR_INVALID_TIME the time can not be reached - ************************************************************************ -*/ -M4OSA_ERR M4READER_AMR_jump(M4OSA_Context context, M4_StreamHandler *pStreamHandler, - M4OSA_Int32* pTime) -{ - M4READER_AMR_Context* pC = (M4READER_AMR_Context*)context; - M4SYS_StreamID streamIdArray[2]; - M4OSA_ERR err; - M4SYS_AccessUnit* pAu; - M4OSA_Time time64 = (M4OSA_Time)*pTime; - M4AMRR_State State; - - M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, "M4READER_AMR_reset: invalid context"); - M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, - "M4READER_AMR_reset: invalid pointer to M4_StreamHandler"); - M4OSA_DEBUG_IF1((pTime == 0), M4ERR_PARAMETER, "M4READER_3GP_jump: invalid time pointer"); - - if (pStreamHandler == (M4_StreamHandler*)pC->m_pAudioStream) - { - pAu = &pC->m_audioAu; - } - else - { - M4OSA_TRACE1_0("M4READER_AMR_jump: passed StreamHandler is not known\n"); - return M4ERR_PARAMETER; - } - - err = M4AMRR_getState(pC->m_pCoreContext, &State, pStreamHandler->m_streamId); - if (M4AMRR_kReading_nextAU == State) - { - err = M4AMRR_freeAU(pC->m_pCoreContext, pStreamHandler->m_streamId, pAu); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_0("M4READER_AMR_jump: error when freeing access unit\n"); - return err; - } - pAu->dataAddress = M4OSA_NULL; - } - - streamIdArray[0] = pStreamHandler->m_streamId; - streamIdArray[1] = 0; - - pAu->CTS = time64; - pAu->DTS = time64; - err = M4AMRR_seek(pC->m_pCoreContext, streamIdArray, time64, M4SYS_kNoRAPprevious, &time64); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_0("M4READER_AMR_jump: error when calling M4AMRR_seek()\n"); - return err; - } - - *pTime = (M4OSA_Int32)time64; - - return err; -} - -/** - ************************************************************************ - * @brief Gets an access unit (AU) from the stream handler source. - * @note An AU is the smallest possible amount of data to be decoded by a decoder (audio/video). - * In the current version, we need to translate M4OSA_AccessUnit to M4_AccessUnit - * - * @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 - * @return M4ERR_ALLOC memory allocation failed - * @return M4ERR_BAD_STREAM_ID at least one of the stream Id. does not exist. - * @return M4WAR_NO_MORE_AU there are no more access unit in the stream (end of stream) - ************************************************************************ -*/ -M4OSA_ERR M4READER_AMR_getNextAu(M4OSA_Context context, M4_StreamHandler *pStreamHandler, - M4_AccessUnit *pAccessUnit) -{ - M4READER_AMR_Context* pC = (M4READER_AMR_Context*)context; - M4OSA_ERR err = M4NO_ERROR; - M4SYS_AccessUnit* pAu; - M4_MediaTime timeScale; - M4AMRR_State State; - - M4OSA_DEBUG_IF1((pC == 0), M4ERR_PARAMETER, - "M4READER_AMR_getNextAu: invalid context"); - M4OSA_DEBUG_IF1((pStreamHandler == 0), M4ERR_PARAMETER, - "M4READER_AMR_getNextAu: invalid pointer to M4_StreamHandler"); - M4OSA_DEBUG_IF1((pAccessUnit == 0), M4ERR_PARAMETER, - "M4READER_AMR_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_AMR_getNextAu: passed StreamHandler is not known\n"); - return M4ERR_PARAMETER; - } - - err = M4AMRR_getState(pC->m_pCoreContext, &State, pStreamHandler->m_streamId); - if (M4AMRR_kReading_nextAU == State) - { - err = M4AMRR_freeAU(pC->m_pCoreContext, pStreamHandler->m_streamId, pAu); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_0("M4READER_AVI_getNextAu: error when freeing access unit\n"); - return err; - } - pAu->dataAddress = M4OSA_NULL; - } - - pAu->nbFrag = 0; - err = M4AMRR_nextAU(pC->m_pCoreContext, pStreamHandler->m_streamId, pAu); - - if (err == M4NO_ERROR) - { - timeScale = (M4OSA_Float)(M4OSA_Int32)(intptr_t)(pStreamHandler->m_pUserData)/1000; - pAccessUnit->m_dataAddress = (M4OSA_MemAddr8)pAu->dataAddress; - pAccessUnit->m_size = pAu->size; - pAccessUnit->m_CTS = (M4_MediaTime)pAu->CTS/*/timeScale*/; - pAccessUnit->m_DTS = (M4_MediaTime)pAu->DTS/*/timeScale*/; - pAccessUnit->m_attribute = pAu->attribute; - } - else - { - pAccessUnit->m_size=0; - } - - 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_AMR_getInterfaces(M4READER_MediaType *pMediaType, - M4READER_GlobalInterface **pRdrGlobalInterface, - M4READER_DataInterface **pRdrDataInterface) -{ - M4OSA_DEBUG_IF1((pMediaType == 0), M4ERR_PARAMETER, - "M4READER_AMR_getInterfaces: invalid pointer to MediaType"); - M4OSA_DEBUG_IF1((pRdrGlobalInterface == 0), M4ERR_PARAMETER, - "M4READER_AMR_getInterfaces: invalid pointer to M4READER_GlobalInterface"); - M4OSA_DEBUG_IF1((pRdrDataInterface == 0), M4ERR_PARAMETER, - "M4READER_AMR_getInterfaces: invalid pointer to M4READER_DataInterface"); - - *pRdrGlobalInterface = - (M4READER_GlobalInterface*)M4OSA_32bitAlignedMalloc( sizeof(M4READER_GlobalInterface), - M4READER_AMR, (M4OSA_Char *)"M4READER_GlobalInterface" ); - if (M4OSA_NULL == *pRdrGlobalInterface) - { - *pRdrDataInterface = M4OSA_NULL; - return M4ERR_ALLOC; - } - *pRdrDataInterface = (M4READER_DataInterface*)M4OSA_32bitAlignedMalloc( sizeof(M4READER_DataInterface), - M4READER_AMR, (M4OSA_Char *)"M4READER_DataInterface"); - if (M4OSA_NULL == *pRdrDataInterface) - { - free(*pRdrGlobalInterface); - *pRdrGlobalInterface = M4OSA_NULL; - return M4ERR_ALLOC; - } - - *pMediaType = M4READER_kMediaTypeAMR; - - (*pRdrGlobalInterface)->m_pFctCreate = M4READER_AMR_create; - (*pRdrGlobalInterface)->m_pFctDestroy = M4READER_AMR_destroy; - (*pRdrGlobalInterface)->m_pFctOpen = M4READER_AMR_open; - (*pRdrGlobalInterface)->m_pFctClose = M4READER_AMR_close; - (*pRdrGlobalInterface)->m_pFctGetOption = M4READER_AMR_getOption; - (*pRdrGlobalInterface)->m_pFctSetOption = M4READER_AMR_setOption; - (*pRdrGlobalInterface)->m_pFctGetNextStream = M4READER_AMR_getNextStream; - (*pRdrGlobalInterface)->m_pFctFillAuStruct = M4READER_AMR_fillAuStruct; - (*pRdrGlobalInterface)->m_pFctStart = M4OSA_NULL; - (*pRdrGlobalInterface)->m_pFctStop = M4OSA_NULL; - (*pRdrGlobalInterface)->m_pFctJump = M4READER_AMR_jump; - (*pRdrGlobalInterface)->m_pFctReset = M4READER_AMR_reset; - (*pRdrGlobalInterface)->m_pFctGetPrevRapTime = M4OSA_NULL; /*all AUs are RAP*/ - - (*pRdrDataInterface)->m_pFctGetNextAu = M4READER_AMR_getNextAu; - - (*pRdrDataInterface)->m_readerContext = M4OSA_NULL; - - return M4NO_ERROR; -} - 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; -} - - diff --git a/libvideoeditor/vss/src/M4VD_EXTERNAL_BitstreamParser.c b/libvideoeditor/vss/src/M4VD_EXTERNAL_BitstreamParser.c deleted file mode 100755 index fb83952..0000000 --- a/libvideoeditor/vss/src/M4VD_EXTERNAL_BitstreamParser.c +++ /dev/null @@ -1,703 +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. - */ -#include <inttypes.h> - -#include "utils/Log.h" -#include "M4OSA_Types.h" -#include "M4OSA_Debug.h" - -#include "M4VD_EXTERNAL_Interface.h" -#include "M4VD_Tools.h" -#include "M4_VideoEditingCommon.h" -#include "OMX_Video.h" -/** - ************************************************************************ - * @file M4VD_EXTERNAL_BitstreamParser.c - * @brief - * @note This file implements external Bitstream parser - ************************************************************************ - */ - -typedef struct { - M4OSA_UInt8 code; - M4OSA_Int32 profile; - M4OSA_Int32 level; -} codeProfileLevel; - -static codeProfileLevel mpeg4ProfileLevelTable[] = { - {0x01, OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1}, - {0x02, OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level2}, - {0x03, OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level3}, - {0x04, OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4a}, - {0x05, OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level5}, - {0x08, OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0}, - {0x11, OMX_VIDEO_MPEG4ProfileSimpleScalable,OMX_VIDEO_MPEG4Level1}, - {0x12, OMX_VIDEO_MPEG4ProfileSimpleScalable,OMX_VIDEO_MPEG4Level2}, - {0x21, OMX_VIDEO_MPEG4ProfileCore, OMX_VIDEO_MPEG4Level1}, - {0x22, OMX_VIDEO_MPEG4ProfileCore, OMX_VIDEO_MPEG4Level2}, - {0x32, OMX_VIDEO_MPEG4ProfileMain, OMX_VIDEO_MPEG4Level2}, - {0x33, OMX_VIDEO_MPEG4ProfileMain, OMX_VIDEO_MPEG4Level3}, - {0x34, OMX_VIDEO_MPEG4ProfileMain, OMX_VIDEO_MPEG4Level4}, - {0x42, OMX_VIDEO_MPEG4ProfileNbit, OMX_VIDEO_MPEG4Level2}, - {0x51, OMX_VIDEO_MPEG4ProfileScalableTexture, OMX_VIDEO_MPEG4Level1}, - {0x61, OMX_VIDEO_MPEG4ProfileSimpleFace, OMX_VIDEO_MPEG4Level1}, - {0x62, OMX_VIDEO_MPEG4ProfileSimpleFace, OMX_VIDEO_MPEG4Level2}, - {0x71, OMX_VIDEO_MPEG4ProfileBasicAnimated, OMX_VIDEO_MPEG4Level1}, - {0x72, OMX_VIDEO_MPEG4ProfileBasicAnimated, OMX_VIDEO_MPEG4Level2}, - {0x81, OMX_VIDEO_MPEG4ProfileHybrid, OMX_VIDEO_MPEG4Level1}, - {0x82, OMX_VIDEO_MPEG4ProfileHybrid, OMX_VIDEO_MPEG4Level2}, - {0x91, OMX_VIDEO_MPEG4ProfileAdvancedRealTime, OMX_VIDEO_MPEG4Level1}, - {0x92, OMX_VIDEO_MPEG4ProfileAdvancedRealTime, OMX_VIDEO_MPEG4Level2}, - {0x93, OMX_VIDEO_MPEG4ProfileAdvancedRealTime, OMX_VIDEO_MPEG4Level3}, - {0x94, OMX_VIDEO_MPEG4ProfileAdvancedRealTime, OMX_VIDEO_MPEG4Level4}, - {0xa1, OMX_VIDEO_MPEG4ProfileCoreScalable, OMX_VIDEO_MPEG4Level1}, - {0xa2, OMX_VIDEO_MPEG4ProfileCoreScalable, OMX_VIDEO_MPEG4Level2}, - {0xa3, OMX_VIDEO_MPEG4ProfileCoreScalable, OMX_VIDEO_MPEG4Level3}, - {0xb1, OMX_VIDEO_MPEG4ProfileAdvancedCoding, OMX_VIDEO_MPEG4Level1}, - {0xb2, OMX_VIDEO_MPEG4ProfileAdvancedCoding, OMX_VIDEO_MPEG4Level2}, - {0xb3, OMX_VIDEO_MPEG4ProfileAdvancedCoding, OMX_VIDEO_MPEG4Level3}, - {0xb4, OMX_VIDEO_MPEG4ProfileAdvancedCoding, OMX_VIDEO_MPEG4Level4}, - {0xc1, OMX_VIDEO_MPEG4ProfileAdvancedCore, OMX_VIDEO_MPEG4Level1}, - {0xc2, OMX_VIDEO_MPEG4ProfileAdvancedCore, OMX_VIDEO_MPEG4Level2}, - {0xd1, OMX_VIDEO_MPEG4ProfileAdvancedScalable, OMX_VIDEO_MPEG4Level1}, - {0xd2, OMX_VIDEO_MPEG4ProfileAdvancedScalable, OMX_VIDEO_MPEG4Level2}, - {0xd3, OMX_VIDEO_MPEG4ProfileAdvancedScalable, OMX_VIDEO_MPEG4Level3}, - {0xf0, OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0}, - {0xf1, OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level1}, - {0xf2, OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level2}, - {0xf3, OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level3}, - {0xf4, OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4}, - {0xf5, OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level5} -}; - -M4OSA_UInt32 M4VD_EXTERNAL_GetBitsFromMemory(M4VS_Bitstream_ctxt* parsingCtxt, - M4OSA_UInt32 nb_bits) -{ - return(M4VD_Tools_GetBitsFromMemory(parsingCtxt,nb_bits)); -} - -M4OSA_ERR M4VD_EXTERNAL_WriteBitsToMemory(M4OSA_UInt32 bitsToWrite, - M4OSA_MemAddr32 dest_bits, - M4OSA_UInt8 offset, M4OSA_UInt8 nb_bits) -{ - return (M4VD_Tools_WriteBitsToMemory( bitsToWrite,dest_bits, - offset, nb_bits)); -} - -M4OSA_ERR M4DECODER_EXTERNAL_ParseVideoDSI(M4OSA_UInt8* pVol, M4OSA_Int32 aVolSize, - M4DECODER_MPEG4_DecoderConfigInfo* pDci, - M4DECODER_VideoSize* pVideoSize) -{ - M4VS_Bitstream_ctxt parsingCtxt; - M4OSA_UInt32 code, j; - M4OSA_MemAddr8 start; - M4OSA_UInt8 i; - M4OSA_UInt32 time_incr_length; - M4OSA_UInt8 vol_verid=0, b_hierarchy_type; - - /* Parsing variables */ - M4OSA_UInt8 video_object_layer_shape = 0; - M4OSA_UInt8 sprite_enable = 0; - M4OSA_UInt8 reduced_resolution_vop_enable = 0; - M4OSA_UInt8 scalability = 0; - M4OSA_UInt8 enhancement_type = 0; - M4OSA_UInt8 complexity_estimation_disable = 0; - M4OSA_UInt8 interlaced = 0; - M4OSA_UInt8 sprite_warping_points = 0; - M4OSA_UInt8 sprite_brightness_change = 0; - M4OSA_UInt8 quant_precision = 0; - - /* Fill the structure with default parameters */ - pVideoSize->m_uiWidth = 0; - pVideoSize->m_uiHeight = 0; - - pDci->uiTimeScale = 0; - pDci->uiProfile = 0; - pDci->uiUseOfResynchMarker = 0; - pDci->bDataPartition = M4OSA_FALSE; - pDci->bUseOfRVLC = M4OSA_FALSE; - - /* Reset the bitstream context */ - parsingCtxt.stream_byte = 0; - parsingCtxt.stream_index = 8; - parsingCtxt.in = (M4OSA_Int8 *)pVol; - - start = (M4OSA_Int8 *)pVol; - - /* Start parsing */ - while (parsingCtxt.in - start < aVolSize) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8); - if (code == 0) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8); - if (code == 0) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8); - if (code == 1) - { - /* start code found */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8); - - /* ----- 0x20..0x2F : video_object_layer_start_code ----- */ - - if ((code > 0x1F) && (code < 0x30)) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* random accessible vol */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 8);/* video object type indication */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* is object layer identifier */ - if (code == 1) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 4); /* video object layer verid */ - vol_verid = (M4OSA_UInt8)code; - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 3); /* video object layer priority */ - } - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 4);/* aspect ratio */ - if (code == 15) - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 16); /* par_width and par_height (8+8) */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* vol control parameters */ - if (code == 1) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 3);/* chroma format + low delay (3+1) */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* vbv parameters */ - if (code == 1) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 32);/* first and latter half bitrate + 2 marker bits - (15 + 1 + 15 + 1) */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 31);/* first and latter half vbv buffer size + first - half vbv occupancy + marker bits (15+1+3+11+1)*/ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 16);/* first half vbv occupancy + marker bits (15+1)*/ - } - } - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 2); /* video object layer shape */ - /* Need to save it for vop parsing */ - video_object_layer_shape = (M4OSA_UInt8)code; - - if (code != 0) return 0; /* only rectangular case supported */ - - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1); /* Marker bit */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 16); /* VOP time increment resolution */ - pDci->uiTimeScale = code; - - /* Computes time increment length */ - j = code - 1; - for (i = 0; (i < 32) && (j != 0); j >>=1) - { - i++; - } - time_incr_length = (i == 0) ? 1 : i; - - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* Marker bit */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* Fixed VOP rate */ - if (code == 1) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - time_incr_length);/* Fixed VOP time increment */ - } - - if(video_object_layer_shape != 1) /* 1 = Binary */ - { - if(video_object_layer_shape == 0) /* 0 = rectangular */ - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* Marker bit */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 13);/* Width */ - pVideoSize->m_uiWidth = code; - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* Marker bit */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 13);/* Height */ - pVideoSize->m_uiHeight = code; - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* Marker bit */ - } - } - - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* interlaced */ - interlaced = (M4OSA_UInt8)code; - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* OBMC disable */ - - if(vol_verid == 1) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* sprite enable */ - sprite_enable = (M4OSA_UInt8)code; - } - else - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 2);/* sprite enable */ - sprite_enable = (M4OSA_UInt8)code; - } - if ((sprite_enable == 1) || (sprite_enable == 2)) - /* Sprite static = 1 and Sprite GMC = 2 */ - { - if (sprite_enable != 2) - { - - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 13);/* sprite width */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* Marker bit */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 13);/* sprite height */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* Marker bit */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 13);/* sprite l coordinate */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* Marker bit */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 13);/* sprite top coordinate */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* Marker bit */ - } - - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 6);/* sprite warping points */ - sprite_warping_points = (M4OSA_UInt8)code; - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 2);/* sprite warping accuracy */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* sprite brightness change */ - sprite_brightness_change = (M4OSA_UInt8)code; - if (sprite_enable != 2) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* low latency sprite enable */ - } - } - if ((vol_verid != 1) && (video_object_layer_shape != 0)) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* sadct disable */ - } - - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1); /* not 8 bits */ - if (code) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 4);/* quant precision */ - quant_precision = (M4OSA_UInt8)code; - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 4);/* bits per pixel */ - } - - /* greyscale not supported */ - if(video_object_layer_shape == 3) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 3); /* nogray quant update + composition method + - linear composition */ - } - - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* quant type */ - if (code) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* load intra quant mat */ - if (code) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8);/* */ - i = 1; - while (i < 64) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8); - if (code == 0) - break; - i++; - } - } - - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* load non intra quant mat */ - if (code) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8);/* */ - i = 1; - while (i < 64) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8); - if (code == 0) - break; - i++; - } - } - } - - if (vol_verid != 1) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* quarter sample */ - } - - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* complexity estimation disable */ - complexity_estimation_disable = (M4OSA_UInt8)code; - if (!code) - { - //return M4ERR_NOT_IMPLEMENTED; - } - - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* resync marker disable */ - pDci->uiUseOfResynchMarker = (code) ? 0 : 1; - - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, - 1);/* data partitionned */ - pDci->bDataPartition = (code) ? M4OSA_TRUE : M4OSA_FALSE; - if (code) - { - /* reversible VLC */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1); - pDci->bUseOfRVLC = (code) ? M4OSA_TRUE : M4OSA_FALSE; - } - - if (vol_verid != 1) - { - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1);/* newpred */ - if (code) - { - //return M4ERR_PARAMETER; - } - /* reduced resolution vop enable */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1); - reduced_resolution_vop_enable = (M4OSA_UInt8)code; - } - - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1);/* scalability */ - scalability = (M4OSA_UInt8)code; - if (code) - { - /* hierarchy type */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1); - b_hierarchy_type = (M4OSA_UInt8)code; - /* ref layer id */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 4); - /* ref sampling direct */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1); - /* hor sampling factor N */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5); - /* hor sampling factor M */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5); - /* vert sampling factor N */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5); - /* vert sampling factor M */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5); - /* enhancement type */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1); - enhancement_type = (M4OSA_UInt8)code; - if ((!b_hierarchy_type) && (video_object_layer_shape == 1)) - { - /* use ref shape */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1); - /* use ref texture */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1); - /* shape hor sampling factor N */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5); - /* shape hor sampling factor M */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5); - /* shape vert sampling factor N */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5); - /* shape vert sampling factor M */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 5); - } - } - break; - } - - /* ----- 0xB0 : visual_object_sequence_start_code ----- */ - - else if(code == 0xB0) - { - /* profile_and_level_indication */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 8); - pDci->uiProfile = (M4OSA_UInt8)code; - } - - /* ----- 0xB5 : visual_object_start_code ----- */ - - else if(code == 0xB5) - { - /* is object layer identifier */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 1); - if (code == 1) - { - /* visual object verid */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 4); - vol_verid = (M4OSA_UInt8)code; - /* visual object layer priority */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 3); - } - else - { - /* Realign on byte */ - code = M4VD_EXTERNAL_GetBitsFromMemory(&parsingCtxt, 7); - vol_verid = 1; - } - } - - /* ----- end ----- */ - } - else - { - if ((code >> 2) == 0x20) - { - /* H263 ...-> wrong*/ - break; - } - } - } - } - } - - return M4NO_ERROR; -} - -M4OSA_ERR getAVCProfileAndLevel(M4OSA_UInt8* pDSI, M4OSA_Int32 DSISize, - M4OSA_Int32 *pProfile, M4OSA_Int32 *pLevel) { - - M4OSA_UInt16 index = 28; /* the 29th byte is SPS start */ - M4OSA_Bool constraintSet3; - - if ((pProfile == M4OSA_NULL) || (pLevel == M4OSA_NULL)) { - return M4ERR_PARAMETER; - } - - if ((DSISize <= index) || (pDSI == M4OSA_NULL)) { - ALOGE("getAVCProfileAndLevel: DSI is invalid"); - *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE; - *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL; - return M4ERR_PARAMETER; - } - - constraintSet3 = (pDSI[index+2] & 0x10); - ALOGV("getAVCProfileAndLevel profile_byte %d, level_byte: %d constrain3flag: %d", - pDSI[index+1], pDSI[index+3], constraintSet3); - - switch (pDSI[index+1]) { - case 66: - *pProfile = OMX_VIDEO_AVCProfileBaseline; - break; - case 77: - *pProfile = OMX_VIDEO_AVCProfileMain; - break; - case 88: - *pProfile = OMX_VIDEO_AVCProfileExtended; - break; - case 100: - *pProfile = OMX_VIDEO_AVCProfileHigh; - break; - case 110: - *pProfile = OMX_VIDEO_AVCProfileHigh10; - break; - case 122: - *pProfile = OMX_VIDEO_AVCProfileHigh422; - break; - case 244: - *pProfile = OMX_VIDEO_AVCProfileHigh444; - break; - default: - *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE; - } - - switch (pDSI[index+3]) { - case 10: - *pLevel = OMX_VIDEO_AVCLevel1; - break; - case 11: - if (constraintSet3) - *pLevel = OMX_VIDEO_AVCLevel1b; - else - *pLevel = OMX_VIDEO_AVCLevel11; - break; - case 12: - *pLevel = OMX_VIDEO_AVCLevel12; - break; - case 13: - *pLevel = OMX_VIDEO_AVCLevel13; - break; - case 20: - *pLevel = OMX_VIDEO_AVCLevel2; - break; - case 21: - *pLevel = OMX_VIDEO_AVCLevel21; - break; - case 22: - *pLevel = OMX_VIDEO_AVCLevel22; - break; - case 30: - *pLevel = OMX_VIDEO_AVCLevel3; - break; - case 31: - *pLevel = OMX_VIDEO_AVCLevel31; - break; - case 32: - *pLevel = OMX_VIDEO_AVCLevel32; - break; - case 40: - *pLevel = OMX_VIDEO_AVCLevel4; - break; - case 41: - *pLevel = OMX_VIDEO_AVCLevel41; - break; - case 42: - *pLevel = OMX_VIDEO_AVCLevel42; - break; - case 50: - *pLevel = OMX_VIDEO_AVCLevel5; - break; - case 51: - *pLevel = OMX_VIDEO_AVCLevel51; - break; - default: - *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL; - } - ALOGV("getAVCProfileAndLevel profile %" PRId32 " level %" PRId32, - *pProfile, *pLevel); - return M4NO_ERROR; -} - -M4OSA_ERR getH263ProfileAndLevel(M4OSA_UInt8* pDSI, M4OSA_Int32 DSISize, - M4OSA_Int32 *pProfile, M4OSA_Int32 *pLevel) { - - M4OSA_UInt16 index = 7; /* the 5th and 6th bytes contain the level and profile */ - - if ((pProfile == M4OSA_NULL) || (pLevel == M4OSA_NULL)) { - ALOGE("getH263ProfileAndLevel invalid pointer for pProfile"); - return M4ERR_PARAMETER; - } - - if ((DSISize < index) || (pDSI == M4OSA_NULL)) { - ALOGE("getH263ProfileAndLevel: DSI is invalid"); - *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE; - *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL; - return M4ERR_PARAMETER; - } - ALOGV("getH263ProfileAndLevel profile_byte %d, level_byte %d", - pDSI[6], pDSI[5]); - /* get the H263 level */ - switch (pDSI[5]) { - case 10: - *pLevel = OMX_VIDEO_H263Level10; - break; - case 20: - *pLevel = OMX_VIDEO_H263Level20; - break; - case 30: - *pLevel = OMX_VIDEO_H263Level30; - break; - case 40: - *pLevel = OMX_VIDEO_H263Level40; - break; - case 45: - *pLevel = OMX_VIDEO_H263Level45; - break; - case 50: - *pLevel = OMX_VIDEO_H263Level50; - break; - case 60: - *pLevel = OMX_VIDEO_H263Level60; - break; - case 70: - *pLevel = OMX_VIDEO_H263Level70; - break; - default: - *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL; - } - - /* get H263 profile */ - switch (pDSI[6]) { - case 0: - *pProfile = OMX_VIDEO_H263ProfileBaseline; - break; - case 1: - *pProfile = OMX_VIDEO_H263ProfileH320Coding; - break; - case 2: - *pProfile = OMX_VIDEO_H263ProfileBackwardCompatible; - break; - case 3: - *pProfile = OMX_VIDEO_H263ProfileISWV2; - break; - case 4: - *pProfile = OMX_VIDEO_H263ProfileISWV3; - break; - case 5: - *pProfile = OMX_VIDEO_H263ProfileHighCompression; - break; - case 6: - *pProfile = OMX_VIDEO_H263ProfileInternet; - break; - case 7: - *pProfile = OMX_VIDEO_H263ProfileInterlace; - break; - case 8: - *pProfile = OMX_VIDEO_H263ProfileHighLatency; - break; - default: - *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE; - } - ALOGV("getH263ProfileAndLevel profile %" PRId32 " level %" PRId32, - *pProfile, *pLevel); - return M4NO_ERROR; -} - -M4OSA_ERR getMPEG4ProfileAndLevel(M4OSA_UInt8 profileAndLevel, - M4OSA_Int32 *pProfile, M4OSA_Int32 *pLevel) { - - M4OSA_UInt32 i = 0; - M4OSA_UInt32 length = 0; - if ((pProfile == M4OSA_NULL) || (pLevel == M4OSA_NULL)) { - return M4ERR_PARAMETER; - } - ALOGV("getMPEG4ProfileAndLevel profileAndLevel %d", profileAndLevel); - length = sizeof(mpeg4ProfileLevelTable) /sizeof(mpeg4ProfileLevelTable[0]); - *pProfile = M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE; - *pLevel = M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL; - for (i = 0; i < length; i++) { - if (mpeg4ProfileLevelTable[i].code == profileAndLevel) { - *pProfile = mpeg4ProfileLevelTable[i].profile; - *pLevel = mpeg4ProfileLevelTable[i].level; - break; - } - } - ALOGV("getMPEG4ProfileAndLevel profile %" PRId32 " level %" PRId32, - *pProfile, *pLevel); - return M4NO_ERROR; -} diff --git a/libvideoeditor/vss/src/M4VD_Tools.c b/libvideoeditor/vss/src/M4VD_Tools.c deleted file mode 100755 index fdb4b41..0000000 --- a/libvideoeditor/vss/src/M4VD_Tools.c +++ /dev/null @@ -1,99 +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. - */ - -#include "M4OSA_Types.h" -#include "M4OSA_Debug.h" - -#include "M4VD_Tools.h" - -/** - ************************************************************************ - * @file M4VD_Tools.c - * @brief - * @note This file implements helper functions for Bitstream parser - ************************************************************************ - */ - -M4OSA_UInt32 M4VD_Tools_GetBitsFromMemory(M4VS_Bitstream_ctxt* parsingCtxt, - M4OSA_UInt32 nb_bits) -{ - M4OSA_UInt32 code; - M4OSA_UInt32 i; - code = 0; - for (i = 0; i < nb_bits; i++) - { - if (parsingCtxt->stream_index == 8) - { - //M4OSA_memcpy( (M4OSA_MemAddr8)&(parsingCtxt->stream_byte), parsingCtxt->in, - // sizeof(unsigned char)); - parsingCtxt->stream_byte = (unsigned char)(parsingCtxt->in)[0]; - parsingCtxt->in++; - //fread(&stream_byte, sizeof(unsigned char),1,in); - parsingCtxt->stream_index = 0; - } - code = (code << 1); - code |= ((parsingCtxt->stream_byte & 0x80) >> 7); - - parsingCtxt->stream_byte = (parsingCtxt->stream_byte << 1); - parsingCtxt->stream_index++; - } - - return code; -} - -M4OSA_ERR M4VD_Tools_WriteBitsToMemory(M4OSA_UInt32 bitsToWrite, - M4OSA_MemAddr32 dest_bits, - M4OSA_UInt8 offset, M4OSA_UInt8 nb_bits) -{ - M4OSA_UInt8 i,j; - M4OSA_UInt32 temp_dest = 0, mask = 0, temp = 1; - M4OSA_UInt32 input = bitsToWrite; - input = (input << (32 - nb_bits - offset)); - - /* Put destination buffer to 0 */ - for(j=0;j<3;j++) - { - for(i=0;i<8;i++) - { - if((j*8)+i >= offset && (j*8)+i < nb_bits + offset) - { - mask |= (temp << ((7*(j+1))-i+j)); - } - } - } - mask = ~mask; - *dest_bits &= mask; - - /* Parse input bits, and fill output buffer */ - for(j=0;j<3;j++) - { - for(i=0;i<8;i++) - { - if((j*8)+i >= offset && (j*8)+i < nb_bits + offset) - { - temp = ((input & (0x80000000 >> offset)) >> (31-offset)); - //*dest_bits |= (temp << (31 - i)); - *dest_bits |= (temp << ((7*(j+1))-i+j)); - input = (input << 1); - } - } - } - - return M4NO_ERROR; -} - - - diff --git a/libvideoeditor/vss/src/M4VIFI_xVSS_RGB565toYUV420.c b/libvideoeditor/vss/src/M4VIFI_xVSS_RGB565toYUV420.c deleted file mode 100755 index 86bb46b..0000000 --- a/libvideoeditor/vss/src/M4VIFI_xVSS_RGB565toYUV420.c +++ /dev/null @@ -1,219 +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 M4VIFI_RGB565toYUV420.c - * @brief Contain video library function - * @note Color Conversion Filter - * -# Contains the format conversion filters from RGB565 to YUV420 - ****************************************************************************** -*/ - -/* Prototypes of functions, and type definitions */ -#include "M4VIFI_FiltersAPI.h" -/* Macro definitions */ -#include "M4VIFI_Defines.h" -/* Clip table declaration */ -#include "M4VIFI_Clip.h" - - -/** - ****************************************************************************** - * M4VIFI_UInt8 M4VIFI_RGB565toYUV420 (void *pUserData, - * M4VIFI_ImagePlane *pPlaneIn, - * M4VIFI_ImagePlane *pPlaneOut) - * @brief transform RGB565 image to a YUV420 image. - * @note Convert RGB565 to YUV420, - * Loop on each row ( 2 rows by 2 rows ) - * Loop on each column ( 2 col by 2 col ) - * Get 4 RGB samples from input data and build 4 output Y samples - * and each single U & V data - * end loop on col - * end loop on row - * @param pUserData: (IN) User Specific Data - * @param pPlaneIn: (IN) Pointer to RGB565 Plane - * @param pPlaneOut: (OUT) Pointer to YUV420 buffer Plane - * @return M4VIFI_OK: there is no error - * @return M4VIFI_ILLEGAL_FRAME_HEIGHT: YUV Plane height is ODD - * @return M4VIFI_ILLEGAL_FRAME_WIDTH: YUV Plane width is ODD - ****************************************************************************** -*/ -M4VIFI_UInt8 M4VIFI_xVSS_RGB565toYUV420(void *pUserData, M4VIFI_ImagePlane *pPlaneIn, - M4VIFI_ImagePlane *pPlaneOut) -{ - M4VIFI_UInt32 u32_width, u32_height; - M4VIFI_UInt32 u32_stride_Y, u32_stride2_Y, u32_stride_U, u32_stride_V; - M4VIFI_UInt32 u32_stride_rgb, u32_stride_2rgb; - M4VIFI_UInt32 u32_col, u32_row; - - M4VIFI_Int32 i32_r00, i32_r01, i32_r10, i32_r11; - M4VIFI_Int32 i32_g00, i32_g01, i32_g10, i32_g11; - M4VIFI_Int32 i32_b00, i32_b01, i32_b10, i32_b11; - M4VIFI_Int32 i32_y00, i32_y01, i32_y10, i32_y11; - M4VIFI_Int32 i32_u00, i32_u01, i32_u10, i32_u11; - M4VIFI_Int32 i32_v00, i32_v01, i32_v10, i32_v11; - M4VIFI_UInt8 *pu8_yn, *pu8_ys, *pu8_u, *pu8_v; - M4VIFI_UInt8 *pu8_y_data, *pu8_u_data, *pu8_v_data; - M4VIFI_UInt8 *pu8_rgbn_data, *pu8_rgbn; - M4VIFI_UInt16 u16_pix1, u16_pix2, u16_pix3, u16_pix4; - M4VIFI_UInt8 count_null=0; - - /* Check planes height are appropriate */ - if( (pPlaneIn->u_height != pPlaneOut[0].u_height) || - (pPlaneOut[0].u_height != (pPlaneOut[1].u_height<<1)) || - (pPlaneOut[0].u_height != (pPlaneOut[2].u_height<<1))) - { - return M4VIFI_ILLEGAL_FRAME_HEIGHT; - } - - /* Check planes width are appropriate */ - if( (pPlaneIn->u_width != pPlaneOut[0].u_width) || - (pPlaneOut[0].u_width != (pPlaneOut[1].u_width<<1)) || - (pPlaneOut[0].u_width != (pPlaneOut[2].u_width<<1))) - { - return M4VIFI_ILLEGAL_FRAME_WIDTH; - } - - /* Set the pointer to the beginning of the output data buffers */ - pu8_y_data = pPlaneOut[0].pac_data + pPlaneOut[0].u_topleft; - pu8_u_data = pPlaneOut[1].pac_data + pPlaneOut[1].u_topleft; - pu8_v_data = pPlaneOut[2].pac_data + pPlaneOut[2].u_topleft; - - /* Set the pointer to the beginning of the input data buffers */ - pu8_rgbn_data = pPlaneIn->pac_data + pPlaneIn->u_topleft; - - /* Get the size of the output image */ - u32_width = pPlaneOut[0].u_width; - u32_height = pPlaneOut[0].u_height; - - /* Set the size of the memory jumps corresponding to row jump in each output plane */ - u32_stride_Y = pPlaneOut[0].u_stride; - u32_stride2_Y = u32_stride_Y << 1; - u32_stride_U = pPlaneOut[1].u_stride; - u32_stride_V = pPlaneOut[2].u_stride; - - /* Set the size of the memory jumps corresponding to row jump in input plane */ - u32_stride_rgb = pPlaneIn->u_stride; - u32_stride_2rgb = u32_stride_rgb << 1; - - - /* Loop on each row of the output image, input coordinates are estimated from output ones */ - /* Two YUV rows are computed at each pass */ - for (u32_row = u32_height ;u32_row != 0; u32_row -=2) - { - /* Current Y plane row pointers */ - pu8_yn = pu8_y_data; - /* Next Y plane row pointers */ - pu8_ys = pu8_yn + u32_stride_Y; - /* Current U plane row pointer */ - pu8_u = pu8_u_data; - /* Current V plane row pointer */ - pu8_v = pu8_v_data; - - pu8_rgbn = pu8_rgbn_data; - - /* Loop on each column of the output image */ - for (u32_col = u32_width; u32_col != 0 ; u32_col -=2) - { - /* Get four RGB 565 samples from input data */ - u16_pix1 = *( (M4VIFI_UInt16 *) pu8_rgbn); - u16_pix2 = *( (M4VIFI_UInt16 *) (pu8_rgbn + CST_RGB_16_SIZE)); - u16_pix3 = *( (M4VIFI_UInt16 *) (pu8_rgbn + u32_stride_rgb)); - u16_pix4 = *( (M4VIFI_UInt16 *) (pu8_rgbn + u32_stride_rgb + CST_RGB_16_SIZE)); - - /* Unpack RGB565 to 8bit R, G, B */ - /* (x,y) */ - GET_RGB565(i32_b00,i32_g00,i32_r00,u16_pix1); - /* (x+1,y) */ - GET_RGB565(i32_b10,i32_g10,i32_r10,u16_pix2); - /* (x,y+1) */ - GET_RGB565(i32_b01,i32_g01,i32_r01,u16_pix3); - /* (x+1,y+1) */ - GET_RGB565(i32_b11,i32_g11,i32_r11,u16_pix4); - /* If RGB is transparent color (0, 63, 0), we transform it to white (31,63,31) */ - if(i32_b00 == 0 && i32_g00 == 63 && i32_r00 == 0) - { - i32_b00 = 31; - i32_r00 = 31; - } - if(i32_b10 == 0 && i32_g10 == 63 && i32_r10 == 0) - { - i32_b10 = 31; - i32_r10 = 31; - } - if(i32_b01 == 0 && i32_g01 == 63 && i32_r01 == 0) - { - i32_b01 = 31; - i32_r01 = 31; - } - if(i32_b11 == 0 && i32_g11 == 63 && i32_r11 == 0) - { - i32_b11 = 31; - i32_r11 = 31; - } - /* Convert RGB value to YUV */ - i32_u00 = U16(i32_r00, i32_g00, i32_b00); - i32_v00 = V16(i32_r00, i32_g00, i32_b00); - /* luminance value */ - i32_y00 = Y16(i32_r00, i32_g00, i32_b00); - - i32_u10 = U16(i32_r10, i32_g10, i32_b10); - i32_v10 = V16(i32_r10, i32_g10, i32_b10); - /* luminance value */ - i32_y10 = Y16(i32_r10, i32_g10, i32_b10); - - i32_u01 = U16(i32_r01, i32_g01, i32_b01); - i32_v01 = V16(i32_r01, i32_g01, i32_b01); - /* luminance value */ - i32_y01 = Y16(i32_r01, i32_g01, i32_b01); - - i32_u11 = U16(i32_r11, i32_g11, i32_b11); - i32_v11 = V16(i32_r11, i32_g11, i32_b11); - /* luminance value */ - i32_y11 = Y16(i32_r11, i32_g11, i32_b11); - - /* Store luminance data */ - pu8_yn[0] = (M4VIFI_UInt8)i32_y00; - pu8_yn[1] = (M4VIFI_UInt8)i32_y10; - pu8_ys[0] = (M4VIFI_UInt8)i32_y01; - pu8_ys[1] = (M4VIFI_UInt8)i32_y11; - *pu8_u = (M4VIFI_UInt8)((i32_u00 + i32_u01 + i32_u10 + i32_u11 + 2) >> 2); - *pu8_v = (M4VIFI_UInt8)((i32_v00 + i32_v01 + i32_v10 + i32_v11 + 2) >> 2); - /* Prepare for next column */ - pu8_rgbn += (CST_RGB_16_SIZE<<1); - /* Update current Y plane line pointer*/ - pu8_yn += 2; - /* Update next Y plane line pointer*/ - pu8_ys += 2; - /* Update U plane line pointer*/ - pu8_u ++; - /* Update V plane line pointer*/ - pu8_v ++; - } /* End of horizontal scanning */ - - /* Prepare pointers for the next row */ - pu8_y_data += u32_stride2_Y; - pu8_u_data += u32_stride_U; - pu8_v_data += u32_stride_V; - pu8_rgbn_data += u32_stride_2rgb; - - - } /* End of vertical scanning */ - - return M4VIFI_OK; -} -/* End of file M4VIFI_RGB565toYUV420.c */ - diff --git a/libvideoeditor/vss/src/M4VSS3GPP_AudioMixing.c b/libvideoeditor/vss/src/M4VSS3GPP_AudioMixing.c deleted file mode 100755 index bf0bc06..0000000 --- a/libvideoeditor/vss/src/M4VSS3GPP_AudioMixing.c +++ /dev/null @@ -1,4139 +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 M4VSS3GPP_AudioMixing.c - * @brief Video Studio Service 3GPP audio mixing implementation. - * @note - ****************************************************************************** - */ - -/****************/ -/*** Includes ***/ -/****************/ - -#include "NXPSW_CompilerSwitches.h" -/** - * Our headers */ -#include "M4VSS3GPP_API.h" -#include "M4VSS3GPP_InternalTypes.h" -#include "M4VSS3GPP_InternalFunctions.h" -#include "M4VSS3GPP_ErrorCodes.h" - -/* Put the definition of silence frames here */ -#define M4VSS3GPP_SILENCE_FRAMES -#include "M4VSS3GPP_InternalConfig.h" - -/** - * OSAL headers */ -#include "M4OSA_Memory.h" /**< OSAL memory management */ -#include "M4OSA_Debug.h" /**< OSAL debug management */ - - -#include "VideoEditorResampler.h" -/** - ****************************************************************************** - * @brief Static functions - ****************************************************************************** - */ -static M4OSA_ERR -M4VSS3GPP_intAudioMixingOpen( M4VSS3GPP_InternalAudioMixingContext *pC, - M4VSS3GPP_AudioMixingSettings *pSettings ); -static M4OSA_ERR M4VSS3GPP_intAudioMixingStepVideo( - M4VSS3GPP_InternalAudioMixingContext *pC ); -static M4OSA_ERR M4VSS3GPP_intAudioMixingStepAudioMix( - M4VSS3GPP_InternalAudioMixingContext *pC ); -static M4OSA_ERR M4VSS3GPP_intAudioMixingStepAudioReplace( - M4VSS3GPP_InternalAudioMixingContext *pC ); -static M4OSA_ERR M4VSS3GPP_intAudioMixingCopyOrig( - M4VSS3GPP_InternalAudioMixingContext *pC ); -static M4OSA_ERR M4VSS3GPP_intAudioMixingCopyAdded( - M4VSS3GPP_InternalAudioMixingContext *pC ); -static M4OSA_ERR M4VSS3GPP_intAudioMixingConvert( - M4VSS3GPP_InternalAudioMixingContext *pC ); -static M4OSA_ERR M4VSS3GPP_intAudioMixingDoMixing( - M4VSS3GPP_InternalAudioMixingContext *pC ); -static M4OSA_ERR M4VSS3GPP_intAudioMixingWriteSilence( - M4VSS3GPP_InternalAudioMixingContext *pC ); -static M4OSA_ERR M4VSS3GPP_intAudioMixingTransition( - M4VSS3GPP_InternalAudioMixingContext *pC ); -static M4OSA_ERR M4VSS3GPP_intAudioMixingCreateVideoEncoder( - M4VSS3GPP_InternalAudioMixingContext *pC ); -static M4OSA_ERR M4VSS3GPP_intAudioMixingDestroyVideoEncoder( - M4VSS3GPP_InternalAudioMixingContext *pC ); -static M4OSA_Bool M4VSS3GPP_isThresholdBreached( M4OSA_Int32 *averageValue, - M4OSA_Int32 storeCount, - M4OSA_Int32 thresholdValue ); -/** - * Internal warning */ -#define M4VSS3GPP_WAR_END_OF_ADDED_AUDIO M4OSA_ERR_CREATE( M4_WAR, M4VSS3GPP, 0x0030) - -/* A define used with SSRC 1.04 and above to avoid taking -blocks smaller that the minimal block size */ -#define M4VSS_SSRC_MINBLOCKSIZE 600 - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_audioMixingInit(M4VSS3GPP_AudioMixingContext* pContext, - * M4VSS3GPP_AudioMixingSettings* pSettings) - * @brief Initializes the VSS audio mixing operation (allocates an execution context). - * @note - * @param pContext (OUT) Pointer on the VSS audio mixing context to allocate - * @param pSettings (IN) Pointer to valid audio mixing settings - * @param pFileReadPtrFct (IN) Pointer to OSAL file reader functions - * @param pFileWritePtrFct (IN) Pointer to OSAL file writer functions - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL (debug only) - * @return M4ERR_ALLOC: There is no more available memory - ****************************************************************************** - */ - -M4OSA_ERR M4VSS3GPP_audioMixingInit( M4VSS3GPP_AudioMixingContext *pContext, - M4VSS3GPP_AudioMixingSettings *pSettings, - M4OSA_FileReadPointer *pFileReadPtrFct, - M4OSA_FileWriterPointer *pFileWritePtrFct ) -{ - M4VSS3GPP_InternalAudioMixingContext *pC; - M4OSA_ERR err; - - M4OSA_TRACE3_2( - "M4VSS3GPP_audioMixingInit called with pContext=0x%x, pSettings=0x%x", - pContext, pSettings); - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER, - "M4VSS3GPP_audioMixingInit: pContext is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pSettings), M4ERR_PARAMETER, - "M4VSS3GPP_audioMixingInit: pSettings is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pFileReadPtrFct), M4ERR_PARAMETER, - "M4VSS3GPP_audioMixingInit: pFileReadPtrFct is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pFileWritePtrFct), M4ERR_PARAMETER, - "M4VSS3GPP_audioMixingInit: pFileWritePtrFct is M4OSA_NULL"); - - if( pSettings->uiBeginLoop > pSettings->uiEndLoop ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_audioMixingInit: Begin loop time is higher than end loop time!"); - return M4VSS3GPP_ERR_BEGINLOOP_HIGHER_ENDLOOP; - } - - /** - * Allocate the VSS audio mixing context and return it to the user */ - pC = (M4VSS3GPP_InternalAudioMixingContext - *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_InternalAudioMixingContext), - M4VSS3GPP,(M4OSA_Char *)"M4VSS3GPP_InternalAudioMixingContext"); - *pContext = pC; - - if( M4OSA_NULL == pC ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_audioMixingInit(): unable to allocate \ - M4VSS3GPP_InternalAudioMixingContext,returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - - /* Initialization of context Variables */ - memset((void *)pC ,0, - sizeof(M4VSS3GPP_InternalAudioMixingContext)); - /** - * Copy this setting in context */ - pC->iAddCts = pSettings->uiAddCts; - pC->bRemoveOriginal = pSettings->bRemoveOriginal; - pC->b_DuckingNeedeed = pSettings->b_DuckingNeedeed; - pC->InDucking_threshold = pSettings->InDucking_threshold; - pC->fBTVolLevel = pSettings->fBTVolLevel; - pC->fPTVolLevel = pSettings->fPTVolLevel; - pC->InDucking_lowVolume = pSettings->InDucking_lowVolume; - pC->bDoDucking = M4OSA_FALSE; - pC->bLoop = pSettings->bLoop; - pC->bNoLooping = M4OSA_FALSE; - pC->bjumpflag = M4OSA_TRUE; - /** - * Init some context variables */ - - pC->pInputClipCtxt = M4OSA_NULL; - pC->pAddedClipCtxt = M4OSA_NULL; - pC->fOrigFactor = 1.0F; - pC->fAddedFactor = 0.0F; - pC->bSupportSilence = M4OSA_FALSE; - pC->bHasAudio = M4OSA_FALSE; - pC->bAudioMixingIsNeeded = M4OSA_FALSE; - - /* Init PC->ewc members */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - pC->ewc.VideoStreamType = M4SYS_kVideoUnknown; - pC->ewc.bVideoDataPartitioning = M4OSA_FALSE; - pC->ewc.pVideoOutputDsi = M4OSA_NULL; - pC->ewc.AudioStreamType = M4SYS_kAudioUnknown; - pC->ewc.uiNbChannels = 1; - pC->ewc.pAudioOutputDsi = M4OSA_NULL; - pC->ewc.pAudioEncCtxt = M4OSA_NULL; - pC->ewc.pAudioEncDSI.pInfo = M4OSA_NULL; - pC->ewc.pSilenceFrameData = M4OSA_NULL; - pC->ewc.pEncContext = M4OSA_NULL; - pC->ewc.pDummyAuBuffer = M4OSA_NULL; - pC->ewc.p3gpWriterContext = M4OSA_NULL; - pC->pLVAudioResampler = M4OSA_NULL; - /** - * Set the OSAL filesystem function set */ - pC->pOsaFileReadPtr = pFileReadPtrFct; - pC->pOsaFileWritPtr = pFileWritePtrFct; - - /** - * Ssrc stuff */ - pC->b_SSRCneeded = M4OSA_FALSE; - pC->pSsrcBufferIn = M4OSA_NULL; - pC->pSsrcBufferOut = M4OSA_NULL; - pC->pTempBuffer = M4OSA_NULL; - pC->pPosInTempBuffer = M4OSA_NULL; - pC->pPosInSsrcBufferIn = M4OSA_NULL; - pC->pPosInSsrcBufferOut = M4OSA_NULL; - pC->SsrcScratch = M4OSA_NULL; - pC->uiBeginLoop = pSettings->uiBeginLoop; - pC->uiEndLoop = pSettings->uiEndLoop; - - /* - * Reset pointers for media and codecs interfaces */ - err = M4VSS3GPP_clearInterfaceTables(&pC->ShellAPI); - M4ERR_CHECK_RETURN(err); - - /* Call the media and codecs subscription module */ - err = M4VSS3GPP_subscribeMediaAndCodec(&pC->ShellAPI); - M4ERR_CHECK_RETURN(err); - - /** - * Open input clip, added clip and output clip and proceed with the settings */ - err = M4VSS3GPP_intAudioMixingOpen(pC, pSettings); - M4ERR_CHECK_RETURN(err); - - /** - * Update main state automaton */ - if( M4OSA_NULL != pC->pInputClipCtxt->pVideoStream ) - pC->State = M4VSS3GPP_kAudioMixingState_VIDEO; - else - pC->State = M4VSS3GPP_kAudioMixingState_AUDIO_FIRST_SEGMENT; - - pC->ewc.iOutputDuration = (M4OSA_Int32)pC->pInputClipCtxt->pSettings-> - ClipProperties.uiClipDuration; - /*gInputParams.lvBTChannelCount*/ - pC->pLVAudioResampler = LVAudioResamplerCreate(16, - pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels, - /* gInputParams.lvOutSampleRate*/(M4OSA_Int32)pSettings->outputASF, 1); - if( M4OSA_NULL == pC->pLVAudioResampler ) - { - return M4ERR_ALLOC; - } - LVAudiosetSampleRate(pC->pLVAudioResampler, - /*gInputParams.lvInSampleRate*/ - pC->pAddedClipCtxt->pSettings->ClipProperties.uiSamplingFrequency); - - LVAudiosetVolume(pC->pLVAudioResampler, - (M4OSA_Int16)(0x1000 ), - (M4OSA_Int16)(0x1000 )); - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_audioMixingInit(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_audioMixingStep(M4VSS3GPP_AudioMixingContext pContext) - * @brief Perform one step of audio mixing. - * @note - * @param pContext (IN) VSS audio mixing context - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only) - * @param pProgress (OUT) Progress percentage (0 to 100) of the finalization operation - * @return M4ERR_STATE: VSS is not in an appropriate state for this function to be called - * @return M4VSS3GPP_WAR_END_OF_AUDIO_MIXING: Audio mixing is over, user should now call - * M4VSS3GPP_audioMixingCleanUp() - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_audioMixingStep( M4VSS3GPP_AudioMixingContext pContext, - M4OSA_UInt8 *pProgress ) -{ - M4OSA_ERR err; - M4VSS3GPP_InternalAudioMixingContext *pC = - (M4VSS3GPP_InternalAudioMixingContext *)pContext; - - M4OSA_TRACE3_1("M4VSS3GPP_audioMixingStep called with pContext=0x%x", - pContext); - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER, - "M4VSS3GPP_audioMixingStep: pContext is M4OSA_NULL"); - - /** - * State automaton */ - switch( pC->State ) - { - case M4VSS3GPP_kAudioMixingState_VIDEO: - err = M4VSS3GPP_intAudioMixingStepVideo(pC); - - /** - * Compute the progress percentage - * Note: audio and video CTS are not initialized before - * the call of M4VSS3GPP_intAudioMixingStepVideo */ - - /* P4ME00003276: First 0-50% segment is dedicated to state : - M4VSS3GPP_kAudioMixingState_VIDEO */ - *pProgress = (M4OSA_UInt8)(50 * (pC->ewc.WriterVideoAU.CTS) - / pC->pInputClipCtxt->pVideoStream-> - m_basicProperties.m_duration); - - /** - * There may be no audio track (Remove audio track feature). - * In that case we double the current percentage */ - if( M4SYS_kAudioUnknown == pC->ewc.WriterAudioStream.streamType ) - { - ( *pProgress) <<= 1; /**< x2 */ - } - else if( *pProgress >= 50 ) - { - *pProgress = - 49; /**< Video processing is not greater than 50% */ - } - - if( M4WAR_NO_MORE_AU == err ) - { - if( pC->bHasAudio ) - { - /** - * Video is over, state transition to audio and return OK */ - if( pC->iAddCts > 0 ) - pC->State = - M4VSS3GPP_kAudioMixingState_AUDIO_FIRST_SEGMENT; - else - pC->State = - M4VSS3GPP_kAudioMixingState_AUDIO_SECOND_SEGMENT; - } - else - { - /** - * No audio, state transition to FINISHED */ - pC->State = M4VSS3GPP_kAudioMixingState_FINISHED; - } - - return M4NO_ERROR; - } - else if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_audioMixingStep: M4VSS3GPP_intAudioMixingStepVideo returns 0x%x!", - err); - return err; - } - else - { - return M4NO_ERROR; - } - break; - - case M4VSS3GPP_kAudioMixingState_AUDIO_FIRST_SEGMENT: - case M4VSS3GPP_kAudioMixingState_AUDIO_SECOND_SEGMENT: - case M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT: - if( pC->pAddedClipCtxt->iAudioFrameCts - != -pC->pAddedClipCtxt->iSilenceFrameDuration - && (pC->pAddedClipCtxt->iAudioFrameCts - 0.5) - / pC->pAddedClipCtxt->scale_audio > pC->uiEndLoop - && pC->uiEndLoop > 0 ) - { - if(pC->bLoop == M4OSA_FALSE) - { - pC->bNoLooping = M4OSA_TRUE; - } - else - { - M4OSA_Int32 jumpCTS = (M4OSA_Int32)(pC->uiBeginLoop); - - err = pC->pAddedClipCtxt->ShellAPI.m_pReader->m_pFctJump( - pC->pAddedClipCtxt->pReaderContext, - (M4_StreamHandler *)pC->pAddedClipCtxt-> - pAudioStream, &jumpCTS); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_audioMixingStep: error when jumping in added audio clip: 0x%x", - err); - return err; - } - /** - * Use offset to give a correct CTS ... */ - pC->pAddedClipCtxt->iAoffset = - (M4OSA_Int32)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5); - } - - } - - if( M4OSA_FALSE == pC->bRemoveOriginal ) - { - err = M4VSS3GPP_intAudioMixingStepAudioMix(pC); - } - else - { - err = M4VSS3GPP_intAudioMixingStepAudioReplace(pC); - } - - /** - * Compute the progress percentage - * Note: audio and video CTS are not initialized before - * the call of M4VSS3GPP_intAudioMixingStepAudio */ - if( 0 != pC->ewc.iOutputDuration ) - { - /* P4ME00003276: Second 50-100% segment is dedicated to states : - M4VSS3GPP_kAudioMixingState_AUDIO... */ - /* For Audio the progress computation is based on dAto and offset, - it is more accurate */ - *pProgress = (M4OSA_UInt8)(50 - + (50 * pC->ewc.dATo - pC->pInputClipCtxt->iVoffset) - / (pC->ewc.iOutputDuration)); /**< 50 for 100/2 **/ - - if( *pProgress >= 100 ) - { - *pProgress = - 99; /**< It's not really finished, I prefer to return less than 100% */ - } - } - else - { - *pProgress = 99; - } - - if( M4WAR_NO_MORE_AU == err ) - { - /** - * Audio is over, state transition to FINISHED */ - pC->State = M4VSS3GPP_kAudioMixingState_FINISHED; - return M4NO_ERROR; - } - else if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_audioMixingStep: M4VSS3GPP_intAudioMixingStepAudio returns 0x%x!", - err); - return err; - } - else - { - return M4NO_ERROR; - } - break; - - case M4VSS3GPP_kAudioMixingState_FINISHED: - - /** - * Progress percentage: finalize finished -> 100% */ - *pProgress = 100; - - /** - * Audio mixing is finished, return correct warning */ - return M4VSS3GPP_WAR_END_OF_AUDIO_MIXING; - - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_audioMixingStep: State error (0x%x)! Returning M4ERR_STATE", - pC->State); - return M4ERR_STATE; - } -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_audioMixingCleanUp(M4VSS3GPP_AudioMixingContext pContext) - * @brief Free all resources used by the VSS audio mixing operation. - * @note The context is no more valid after this call - * @param pContext (IN) VSS audio mixing context - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only) - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_audioMixingCleanUp( M4VSS3GPP_AudioMixingContext pContext ) -{ - M4VSS3GPP_InternalAudioMixingContext *pC = - (M4VSS3GPP_InternalAudioMixingContext *)pContext; - M4OSA_ERR err; - M4OSA_UInt32 lastCTS; - - M4OSA_TRACE3_1("M4VSS3GPP_audioMixingCleanUp called with pContext=0x%x", - pContext); - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER, - "M4VSS3GPP_audioMixingCleanUp: pContext is M4OSA_NULL"); - - /** - * Check input parameter */ - if( M4OSA_NULL == pContext ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_audioMixingCleanUp(): M4VSS3GPP_audioMixingCleanUp: pContext is\ - M4OSA_NULL, returning M4ERR_PARAMETER"); - return M4ERR_PARAMETER; - } - - /** - * Close Input 3GPP file */ - if( M4OSA_NULL != pC->pInputClipCtxt ) - { - M4VSS3GPP_intClipCleanUp(pC->pInputClipCtxt); - pC->pInputClipCtxt = M4OSA_NULL; - } - - /** - * Close Added 3GPP file */ - if( M4OSA_NULL != pC->pAddedClipCtxt ) - { - M4VSS3GPP_intClipCleanUp(pC->pAddedClipCtxt); - pC->pAddedClipCtxt = M4OSA_NULL; - } - - /** - * Close the 3GP writer. In normal use case it has already been closed, - but not in abort use case */ - if( M4OSA_NULL != pC->ewc.p3gpWriterContext ) - { - /* Update last Video CTS */ - lastCTS = pC->ewc.iOutputDuration; - - err = pC->ShellAPI.pWriterGlobalFcts->pFctSetOption( - pC->ewc.p3gpWriterContext, - (M4OSA_UInt32)M4WRITER_kMaxFileDuration, &lastCTS); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_audioMixingCleanUp: SetOption(M4WRITER_kMaxFileDuration) returns 0x%x", - err); - } - - err = pC->ShellAPI.pWriterGlobalFcts->pFctCloseWrite( - pC->ewc.p3gpWriterContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_audioMixingCleanUp: pWriterGlobalFcts->pFctCloseWrite returns 0x%x!", - err); - /**< don't return the error because we have other things to free! */ - } - pC->ewc.p3gpWriterContext = M4OSA_NULL; - } - - /** - * Free the Audio encoder context */ - if( M4OSA_NULL != pC->ewc.pAudioEncCtxt ) - { - err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctClose( - pC->ewc.pAudioEncCtxt); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_audioMixingCleanUp: pAudioEncoderGlobalFcts->pFctClose returns 0x%x", - err); - /**< don't return, we still have stuff to free */ - } - - err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctCleanUp( - pC->ewc.pAudioEncCtxt); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_audioMixingCleanUp: pAudioEncoderGlobalFcts->pFctCleanUp returns 0x%x", - err); - /**< don't return, we still have stuff to free */ - } - - pC->ewc.pAudioEncCtxt = M4OSA_NULL; - } - - /** - * Free the ssrc stuff */ - - if( M4OSA_NULL != pC->SsrcScratch ) - { - free(pC->SsrcScratch); - pC->SsrcScratch = M4OSA_NULL; - } - - if( M4OSA_NULL != pC->pSsrcBufferIn ) - { - free(pC->pSsrcBufferIn); - pC->pSsrcBufferIn = M4OSA_NULL; - } - - if( M4OSA_NULL != pC->pSsrcBufferOut - && (M4OSA_TRUE == pC->b_SSRCneeded || pC->ChannelConversion > 0) ) - { - free(pC->pSsrcBufferOut); - pC->pSsrcBufferOut = M4OSA_NULL; - } - - if( M4OSA_NULL != pC->pTempBuffer ) - { - free(pC->pTempBuffer); - pC->pTempBuffer = M4OSA_NULL; - } - - if (pC->pLVAudioResampler != M4OSA_NULL) - { - LVDestroy(pC->pLVAudioResampler); - pC->pLVAudioResampler = M4OSA_NULL; - } - - /** - * Free the shells interfaces */ - M4VSS3GPP_unRegisterAllWriters(&pC->ShellAPI); - M4VSS3GPP_unRegisterAllEncoders(&pC->ShellAPI); - M4VSS3GPP_unRegisterAllReaders(&pC->ShellAPI); - M4VSS3GPP_unRegisterAllDecoders(&pC->ShellAPI); - - /** - * Free the context */ - free(pContext); - pContext = M4OSA_NULL; - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_audioMixingCleanUp(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/******************************************************************************/ -/******************************************************************************/ -/********* STATIC FUNCTIONS **********/ -/******************************************************************************/ -/******************************************************************************/ - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioMixingOpen() - * @brief Initializes the VSS audio mixing operation (allocates an execution context). - * @note - * @param pContext (OUT) Pointer on the VSS audio mixing context to allocate - * @param pSettings (IN) Pointer to valid audio mixing settings - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL (debug only) - * @return M4ERR_ALLOC: There is no more available memory - ****************************************************************************** - */ -static M4OSA_ERR -M4VSS3GPP_intAudioMixingOpen( M4VSS3GPP_InternalAudioMixingContext *pC, - M4VSS3GPP_AudioMixingSettings *pSettings ) -{ - M4OSA_ERR err; - M4OSA_UInt32 outputASF = 0; - M4ENCODER_Header *encHeader; - - M4OSA_TRACE3_2( - "M4VSS3GPP_intAudioMixingOpen called with pContext=0x%x, pSettings=0x%x", - pC, pSettings); - - /** - * The Add Volume must be (strictly) superior than zero */ - if( pSettings->uiAddVolume == 0 ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen(): AddVolume is zero,\ - returning M4VSS3GPP_ERR_ADDVOLUME_EQUALS_ZERO"); - return M4VSS3GPP_ERR_ADDVOLUME_EQUALS_ZERO; - } - /* - else if(pSettings->uiAddVolume >= 100) // If volume is set to 100, no more original audio ... - { - pC->bRemoveOriginal = M4OSA_TRUE; - } - */ - /** - * Build the input clip settings */ - pC->InputClipSettings.pFile = - pSettings->pOriginalClipFile; /**< Input 3GPP file descriptor */ - pC->InputClipSettings.FileType = M4VIDEOEDITING_kFileType_3GPP; - pC->InputClipSettings.uiBeginCutTime = - 0; /**< No notion of cut for the audio mixing feature */ - pC->InputClipSettings.uiEndCutTime = - 0; /**< No notion of cut for the audio mixing feature */ - - /** - * Open the original Audio/Video 3GPP clip */ - err = M4VSS3GPP_intClipInit(&pC->pInputClipCtxt, pC->pOsaFileReadPtr); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intClipInit(orig) returns 0x%x", - err); - return err; - } - - err = M4VSS3GPP_intClipOpen(pC->pInputClipCtxt, &pC->InputClipSettings, - M4OSA_FALSE, M4OSA_FALSE, M4OSA_TRUE); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intClipOpen(orig) returns 0x%x", - err); - return err; - } - - if( M4OSA_NULL == pC->pInputClipCtxt->pAudioStream ) - { - pC->bRemoveOriginal = M4OSA_TRUE; - } - /** - * If there is no video, it's an error */ - if( M4OSA_NULL == pC->pInputClipCtxt->pVideoStream ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen(): no video stream in clip,\ - returning M4VSS3GPP_ERR_NO_SUPPORTED_STREAM_IN_FILE"); - return M4VSS3GPP_ERR_NO_SUPPORTED_STREAM_IN_FILE; - } - - /** - * Compute clip properties */ - err = M4VSS3GPP_intBuildAnalysis(pC->pInputClipCtxt, - &pC->pInputClipCtxt->pSettings->ClipProperties); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intBuildAnalysis(orig) returns 0x%x", - err); - return err; - } - - /** - * Build the added clip settings */ - pC->AddedClipSettings.pFile = - pSettings->pAddedAudioTrackFile; /**< Added file descriptor */ - pC->AddedClipSettings.FileType = pSettings->AddedAudioFileType; - pC->AddedClipSettings.uiBeginCutTime = - 0; /**< No notion of cut for the audio mixing feature */ - pC->AddedClipSettings.uiEndCutTime = 0;/**< No notion of cut for the audio mixing feature */ - pC->AddedClipSettings.ClipProperties.uiNbChannels= - pSettings->uiNumChannels; - pC->AddedClipSettings.ClipProperties.uiSamplingFrequency= pSettings->uiSamplingFrequency; - - if( M4OSA_NULL != pC->AddedClipSettings.pFile ) - { - /** - * Open the added Audio clip */ - err = M4VSS3GPP_intClipInit(&pC->pAddedClipCtxt, pC->pOsaFileReadPtr); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intClipInit(added) returns 0x%x", - err); - return err; - } - - err = M4VSS3GPP_intClipOpen(pC->pAddedClipCtxt, &pC->AddedClipSettings, - M4OSA_FALSE, M4OSA_FALSE, M4OSA_TRUE); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intClipOpen(added) returns 0x%x", - err); - return err; - } - - /** - * If there is no audio, it's an error */ - if( M4OSA_NULL == pC->pAddedClipCtxt->pAudioStream ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen(): no audio nor video stream in clip,\ - returning M4VSS3GPP_ERR_NO_SUPPORTED_STREAM_IN_FILE"); - return M4VSS3GPP_ERR_NO_SUPPORTED_STREAM_IN_FILE; - } - - /** - * Compute clip properties */ - err = M4VSS3GPP_intBuildAnalysis(pC->pAddedClipCtxt, - &pC->pAddedClipCtxt->pSettings->ClipProperties); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intBuildAnalysis(added) returns 0x%x", - err); - return err; - } - - switch( pSettings->outputASF ) - { - case M4VIDEOEDITING_k8000_ASF: - outputASF = 8000; - break; - - case M4VIDEOEDITING_k16000_ASF: - outputASF = 16000; - break; - - case M4VIDEOEDITING_k22050_ASF: - outputASF = 22050; - break; - - case M4VIDEOEDITING_k24000_ASF: - outputASF = 24000; - break; - - case M4VIDEOEDITING_k32000_ASF: - outputASF = 32000; - break; - - case M4VIDEOEDITING_k44100_ASF: - outputASF = 44100; - break; - - case M4VIDEOEDITING_k48000_ASF: - outputASF = 48000; - break; - - default: - M4OSA_TRACE1_0("Bad parameter in output ASF "); - return M4ERR_PARAMETER; - break; - } - - if( pC->bRemoveOriginal == M4OSA_TRUE - && (pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType - == M4VIDEOEDITING_kMP3 || pC->pAddedClipCtxt->pSettings-> - ClipProperties.AudioStreamType == M4VIDEOEDITING_kPCM - || pC->pAddedClipCtxt->pSettings-> - ClipProperties.AudioStreamType - != pSettings->outputAudioFormat - || pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiSamplingFrequency != outputASF - || pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels - != pSettings->outputNBChannels) ) - { - - if( pSettings->outputAudioFormat == M4VIDEOEDITING_kAMR_NB ) - { - pSettings->outputASF = M4VIDEOEDITING_k8000_ASF; - pSettings->outputNBChannels = 1; - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize = 320; - } - else if( pSettings->outputAudioFormat == M4VIDEOEDITING_kAAC ) - { - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize = - 2048 * pSettings->outputNBChannels; - } - - pC->pInputClipCtxt->pSettings->ClipProperties.uiSamplingFrequency = - outputASF; - - if( outputASF != pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiSamplingFrequency ) - { - /* We need to call SSRC in order to align ASF and/or nb of channels */ - /* Moreover, audio encoder may be needed in case of audio replacing... */ - pC->b_SSRCneeded = M4OSA_TRUE; - } - - if( pSettings->outputNBChannels - < pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels ) - { - /* Stereo to Mono */ - pC->ChannelConversion = 1; - } - else if( pSettings->outputNBChannels - > pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels ) - { - /* Mono to Stereo */ - pC->ChannelConversion = 2; - } - - pC->pInputClipCtxt->pSettings->ClipProperties.uiNbChannels = - pSettings->outputNBChannels; - } - - /** - * Check compatibility chart */ - err = M4VSS3GPP_intAudioMixingCompatibility(pC, - &pC->pInputClipCtxt->pSettings->ClipProperties, - &pC->pAddedClipCtxt->pSettings->ClipProperties); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen():\ - M4VSS3GPP_intAudioMixingCompatibility returns 0x%x", - err); - return err; - } - - /** - * Check loop parameters */ - if( pC->uiBeginLoop > pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiClipAudioDuration ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen():\ - begin loop time is higher than added clip audio duration"); - return M4VSS3GPP_ERR_BEGINLOOP_HIGHER_ENDLOOP; - } - - /** - * Ok, let's go with this audio track */ - pC->bHasAudio = M4OSA_TRUE; - } - else - { - /* No added file, force remove original */ - pC->AddedClipSettings.FileType = M4VIDEOEDITING_kFileType_Unsupported; - pC->bRemoveOriginal = M4OSA_TRUE; - pC->bHasAudio = M4OSA_FALSE; - } - - /** - * Copy the video properties of the input clip to the output properties */ - pC->ewc.uiVideoBitrate = - pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoBitrate; - pC->ewc.uiVideoWidth = - pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoWidth; - pC->ewc.uiVideoHeight = - pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoHeight; - pC->ewc.uiVideoTimeScale = - pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoTimeScale; - pC->ewc.bVideoDataPartitioning = - pC->pInputClipCtxt->pSettings->ClipProperties.bMPEG4dataPartition; - pC->ewc.outputVideoProfile = - pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoProfile; - pC->ewc.outputVideoLevel = - pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoLevel; - switch( pC->pInputClipCtxt->pSettings->ClipProperties.VideoStreamType ) - { - case M4VIDEOEDITING_kH263: - pC->ewc.VideoStreamType = M4SYS_kH263; - break; - - case M4VIDEOEDITING_kMPEG4: - pC->ewc.VideoStreamType = M4SYS_kMPEG_4; - break; - - case M4VIDEOEDITING_kH264: - pC->ewc.VideoStreamType = M4SYS_kH264; - break; - - default: - pC->ewc.VideoStreamType = M4SYS_kVideoUnknown; - break; - } - - /* Add a link to video dsi */ - if( M4SYS_kH264 == pC->ewc.VideoStreamType ) - { - - /* For H.264 encoder case - * Fetch the DSI from the shell video encoder, and feed it to the writer */ - - M4OSA_TRACE3_0("M4VSS3GPP_intAudioMixingOpen: get DSI for H264 stream"); - - if( M4OSA_NULL == pC->ewc.pEncContext ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen: pC->ewc.pEncContext is NULL"); - err = M4VSS3GPP_intAudioMixingCreateVideoEncoder(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen:\ - M4VSS3GPP_intAudioMixingCreateVideoEncoder returned error 0x%x", - err); - } - } - - if( M4OSA_NULL != pC->ewc.pEncContext ) - { - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctGetOption( - pC->ewc.pEncContext, M4ENCODER_kOptionID_EncoderHeader, - (M4OSA_DataOption) &encHeader); - - if( ( M4NO_ERROR != err) || (M4OSA_NULL == encHeader->pBuf) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen: failed to get the encoder header (err 0x%x)", - err); - M4OSA_TRACE1_2( - "M4VSS3GPP_intAudioMixingOpen: encHeader->pBuf=0x%x, size=0x%x", - encHeader->pBuf, encHeader->Size); - } - else - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen: send DSI for H264 stream to 3GP writer"); - - /** - * Allocate and copy the new DSI */ - pC->ewc.pVideoOutputDsi = - (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(encHeader->Size, M4VSS3GPP, - (M4OSA_Char *)"pC->ewc.pVideoOutputDsi (H264)"); - - if( M4OSA_NULL == pC->ewc.pVideoOutputDsi ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen():\ - unable to allocate pVideoOutputDsi (H264), returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - pC->ewc.uiVideoOutputDsiSize = (M4OSA_UInt16)encHeader->Size; - memcpy((void *)pC->ewc.pVideoOutputDsi, (void *)encHeader->pBuf, - encHeader->Size); - } - - err = M4VSS3GPP_intAudioMixingDestroyVideoEncoder(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen:\ - M4VSS3GPP_intAudioMixingDestroyVideoEncoder returned error 0x%x", - err); - } - } - else - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen: pC->ewc.pEncContext is NULL, cannot get the DSI"); - } - } - else - { - M4OSA_TRACE3_1( - "M4VSS3GPP_intAudioMixingOpen: input clip video stream type = 0x%x", - pC->ewc.VideoStreamType); - pC->ewc.uiVideoOutputDsiSize = - (M4OSA_UInt16)pC->pInputClipCtxt->pVideoStream-> - m_basicProperties.m_decoderSpecificInfoSize; - pC->ewc.pVideoOutputDsi = (M4OSA_MemAddr8)pC->pInputClipCtxt->pVideoStream-> - m_basicProperties.m_pDecoderSpecificInfo; - } - - /** - * Copy the audio properties of the added clip to the output properties */ - if( pC->bHasAudio ) - { - if( pC->bRemoveOriginal == M4OSA_TRUE ) - { - pC->ewc.uiNbChannels = - pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels; - pC->ewc.uiAudioBitrate = - pC->pAddedClipCtxt->pSettings->ClipProperties.uiAudioBitrate; - pC->ewc.uiSamplingFrequency = pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiSamplingFrequency; - pC->ewc.uiSilencePcmSize = - pC->pAddedClipCtxt->pSettings->ClipProperties.uiDecodedPcmSize; - pC->ewc.scale_audio = pC->ewc.uiSamplingFrequency / 1000.0; - - /* if output settings are differents from added clip settings, - we need to reencode BGM */ - if( pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType - != pSettings->outputAudioFormat - || pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiSamplingFrequency != outputASF - || pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels - != pSettings->outputNBChannels - || pC->pAddedClipCtxt->pSettings-> - ClipProperties.AudioStreamType == M4VIDEOEDITING_kMP3 ) - { - /* Set reader DSI to NULL (unknown), we will use encoder DSI later */ - if( pC->pAddedClipCtxt->pAudioStream-> - m_basicProperties.m_pDecoderSpecificInfo != M4OSA_NULL ) - { - - /* - free(pC->pAddedClipCtxt->pAudioStream->\ - m_basicProperties.m_pDecoderSpecificInfo); - */ - pC->pAddedClipCtxt->pAudioStream-> - m_basicProperties.m_decoderSpecificInfoSize = 0; - pC->pAddedClipCtxt->pAudioStream-> - m_basicProperties.m_pDecoderSpecificInfo = M4OSA_NULL; - } - - pC->ewc.uiNbChannels = - pC->pInputClipCtxt->pSettings->ClipProperties.uiNbChannels; - pC->ewc.uiSamplingFrequency = pC->pInputClipCtxt->pSettings-> - ClipProperties.uiSamplingFrequency; - pC->ewc.scale_audio = pC->ewc.uiSamplingFrequency / 1000.0; - - if( pSettings->outputAudioFormat == M4VIDEOEDITING_kAMR_NB ) - { - pC->ewc.AudioStreamType = M4SYS_kAMR; - pC->ewc.pSilenceFrameData = - (M4OSA_UInt8 *)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE; - pC->ewc.iSilenceFrameDuration = - M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_DURATION; - pC->ewc.uiAudioBitrate = 12200; - pC->ewc.uiSamplingFrequency = 8000; - pC->ewc.uiSilencePcmSize = 320; - pC->ewc.scale_audio = pC->ewc.uiSamplingFrequency / 1000.0; - } - else if( pSettings->outputAudioFormat == M4VIDEOEDITING_kAAC ) - { - pC->ewc.AudioStreamType = M4SYS_kAAC; - - if( pSettings->outputAudioBitrate - == M4VIDEOEDITING_kUndefinedBitrate ) - { - switch( pC->ewc.uiSamplingFrequency ) - { - case 16000: - pC->ewc.uiAudioBitrate = - M4VIDEOEDITING_k24_KBPS; - break; - - case 22050: - case 24000: - pC->ewc.uiAudioBitrate = - M4VIDEOEDITING_k32_KBPS; - break; - - case 32000: - pC->ewc.uiAudioBitrate = - M4VIDEOEDITING_k48_KBPS; - break; - - case 44100: - case 48000: - pC->ewc.uiAudioBitrate = - M4VIDEOEDITING_k64_KBPS; - break; - - default: - pC->ewc.uiAudioBitrate = - M4VIDEOEDITING_k64_KBPS; - break; - } - - if( pC->ewc.uiNbChannels == 2 ) - { - /* Output bitrate have to be doubled */ - pC->ewc.uiAudioBitrate += pC->ewc.uiAudioBitrate; - } - } - else - { - pC->ewc.uiAudioBitrate = pSettings->outputAudioBitrate; - } - - if( pC->ewc.uiNbChannels == 1 ) - { - pC->ewc.pSilenceFrameData = - (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_MONO; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AAC_AU_SILENCE_MONO_SIZE; - } - else - { - pC->ewc.pSilenceFrameData = - (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_STEREO; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AAC_AU_SILENCE_STEREO_SIZE; - } - pC->ewc.iSilenceFrameDuration = - 1024; /* AAC is always 1024/Freq sample duration */ - } - } - else - { - switch( pC->pAddedClipCtxt->pSettings-> - ClipProperties.AudioStreamType ) - { - case M4VIDEOEDITING_kAMR_NB: - pC->ewc.AudioStreamType = M4SYS_kAMR; - pC->ewc.pSilenceFrameData = - (M4OSA_UInt8 *)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE; - pC->ewc.iSilenceFrameDuration = - M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_DURATION; - break; - - case M4VIDEOEDITING_kAAC: - case M4VIDEOEDITING_kAACplus: - case M4VIDEOEDITING_keAACplus: - pC->ewc.AudioStreamType = M4SYS_kAAC; - - if( pC->ewc.uiNbChannels == 1 ) - { - pC->ewc.pSilenceFrameData = - (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_MONO; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AAC_AU_SILENCE_MONO_SIZE; - } - else - { - pC->ewc.pSilenceFrameData = - (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_STEREO; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AAC_AU_SILENCE_STEREO_SIZE; - } - pC->ewc.iSilenceFrameDuration = - 1024; /* AAC is always 1024/Freq sample duration */ - break; - - case M4VIDEOEDITING_kEVRC: - pC->ewc.AudioStreamType = M4SYS_kEVRC; - pC->ewc.pSilenceFrameData = M4OSA_NULL; - pC->ewc.uiSilenceFrameSize = 0; - pC->ewc.iSilenceFrameDuration = 160; /* EVRC frames are 20 ms at 8000 Hz - (makes it easier to factorize amr and evrc code) */ - break; - - case M4VIDEOEDITING_kPCM: - /* Set reader DSI to NULL (unknown), we will use encoder DSI later */ - pC->pAddedClipCtxt->pAudioStream-> - m_basicProperties.m_decoderSpecificInfoSize = 0; - pC->pAddedClipCtxt->pAudioStream-> - m_basicProperties.m_pDecoderSpecificInfo = - M4OSA_NULL; - - if( pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiSamplingFrequency == 8000 ) - { - pC->ewc.AudioStreamType = M4SYS_kAMR; - pC->ewc.pSilenceFrameData = (M4OSA_UInt8 - *)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE; - pC->ewc.iSilenceFrameDuration = - M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_DURATION; - pC->ewc.uiAudioBitrate = M4VIDEOEDITING_k12_2_KBPS; - } - else if( pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiSamplingFrequency == 16000 ) - { - if( pC->ewc.uiNbChannels == 1 ) - { - pC->ewc.AudioStreamType = M4SYS_kAAC; - pC->ewc.pSilenceFrameData = (M4OSA_UInt8 - *)M4VSS3GPP_AAC_AU_SILENCE_MONO; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AAC_AU_SILENCE_MONO_SIZE; - pC->ewc.iSilenceFrameDuration = - 1024; /* AAC is always 1024/Freq sample duration */ - pC->ewc.uiAudioBitrate = - M4VIDEOEDITING_k32_KBPS; - } - else - { - pC->ewc.AudioStreamType = M4SYS_kAAC; - pC->ewc.pSilenceFrameData = (M4OSA_UInt8 - *)M4VSS3GPP_AAC_AU_SILENCE_STEREO; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AAC_AU_SILENCE_STEREO_SIZE; - pC->ewc.iSilenceFrameDuration = - 1024; /* AAC is always 1024/Freq sample duration */ - pC->ewc.uiAudioBitrate = - M4VIDEOEDITING_k64_KBPS; - } - } - else - { - pC->ewc.AudioStreamType = M4SYS_kAudioUnknown; - } - break; - - default: - pC->ewc.AudioStreamType = M4SYS_kAudioUnknown; - break; - } - } - - /* Add a link to audio dsi */ - pC->ewc.uiAudioOutputDsiSize = - (M4OSA_UInt16)pC->pAddedClipCtxt->pAudioStream-> - m_basicProperties.m_decoderSpecificInfoSize; - pC->ewc.pAudioOutputDsi = (M4OSA_MemAddr8)pC->pAddedClipCtxt->pAudioStream-> - m_basicProperties.m_pDecoderSpecificInfo; - } - else - { - pC->ewc.uiNbChannels = - pC->pInputClipCtxt->pSettings->ClipProperties.uiNbChannels; - pC->ewc.uiAudioBitrate = - pC->pInputClipCtxt->pSettings->ClipProperties.uiAudioBitrate; - pC->ewc.uiSamplingFrequency = pC->pInputClipCtxt->pSettings-> - ClipProperties.uiSamplingFrequency; - pC->ewc.uiSilencePcmSize = - pC->pInputClipCtxt->pSettings->ClipProperties.uiDecodedPcmSize; - pC->ewc.scale_audio = pC->ewc.uiSamplingFrequency / 1000.0; - - switch( pC->pInputClipCtxt->pSettings-> - ClipProperties.AudioStreamType ) - { - case M4VIDEOEDITING_kAMR_NB: - pC->ewc.AudioStreamType = M4SYS_kAMR; - pC->ewc.pSilenceFrameData = - (M4OSA_UInt8 *)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE; - pC->ewc.iSilenceFrameDuration = - M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_DURATION; - break; - - case M4VIDEOEDITING_kAAC: - case M4VIDEOEDITING_kAACplus: - case M4VIDEOEDITING_keAACplus: - pC->ewc.AudioStreamType = M4SYS_kAAC; - - if( pC->ewc.uiNbChannels == 1 ) - { - pC->ewc.pSilenceFrameData = - (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_MONO; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AAC_AU_SILENCE_MONO_SIZE; - } - else - { - pC->ewc.pSilenceFrameData = - (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_STEREO; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AAC_AU_SILENCE_STEREO_SIZE; - } - pC->ewc.iSilenceFrameDuration = - 1024; /* AAC is always 1024/Freq sample duration */ - break; - - default: - pC->ewc.AudioStreamType = M4SYS_kAudioUnknown; - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen: No audio track in input file."); - return M4VSS3GPP_ERR_AUDIO_CANNOT_BE_MIXED; - break; - } - - /* Add a link to audio dsi */ - pC->ewc.uiAudioOutputDsiSize = - (M4OSA_UInt16)pC->pInputClipCtxt->pAudioStream-> - m_basicProperties.m_decoderSpecificInfoSize; - pC->ewc.pAudioOutputDsi = (M4OSA_MemAddr8)pC->pInputClipCtxt->pAudioStream-> - m_basicProperties.m_pDecoderSpecificInfo; - } - } - - /** - * Copy common 'silence frame stuff' to ClipContext */ - pC->pInputClipCtxt->uiSilencePcmSize = pC->ewc.uiSilencePcmSize; - pC->pInputClipCtxt->pSilenceFrameData = pC->ewc.pSilenceFrameData; - pC->pInputClipCtxt->uiSilenceFrameSize = pC->ewc.uiSilenceFrameSize; - pC->pInputClipCtxt->iSilenceFrameDuration = pC->ewc.iSilenceFrameDuration; - pC->pInputClipCtxt->scale_audio = pC->ewc.scale_audio; - - pC->pInputClipCtxt->iAudioFrameCts = - -pC->pInputClipCtxt->iSilenceFrameDuration; /* Reset time */ - - /** - * Copy common 'silence frame stuff' to ClipContext */ - if( pC->bHasAudio ) - { - pC->pAddedClipCtxt->uiSilencePcmSize = pC->ewc.uiSilencePcmSize; - pC->pAddedClipCtxt->pSilenceFrameData = pC->ewc.pSilenceFrameData; - pC->pAddedClipCtxt->uiSilenceFrameSize = pC->ewc.uiSilenceFrameSize; - pC->pAddedClipCtxt->iSilenceFrameDuration = - pC->ewc.iSilenceFrameDuration; - pC->pAddedClipCtxt->scale_audio = pC->ewc.scale_audio; - - pC->pAddedClipCtxt->iAudioFrameCts = - -pC->pAddedClipCtxt->iSilenceFrameDuration; /* Reset time */ - } - - /** - * Check AddCts is lower than original clip duration */ - if( ( M4OSA_NULL != pC->pInputClipCtxt->pVideoStream) - && (pC->iAddCts > (M4OSA_Int32)pC->pInputClipCtxt->pVideoStream-> - m_basicProperties.m_duration) ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen(): uiAddCts is larger than video duration,\ - returning M4VSS3GPP_ERR_ADDCTS_HIGHER_THAN_VIDEO_DURATION"); - return M4VSS3GPP_ERR_ADDCTS_HIGHER_THAN_VIDEO_DURATION; - } - - /** - * If the audio tracks are not compatible, replace input track by silence */ - if( M4OSA_FALSE == pC->pInputClipCtxt->pSettings-> - ClipProperties.bAudioIsCompatibleWithMasterClip ) - { - M4VSS3GPP_intClipDeleteAudioTrack(pC->pInputClipCtxt); - } - - /** - * Check if audio mixing is required */ - if( ( ( pC->bHasAudio) && (M4OSA_FALSE - == pC->pAddedClipCtxt->pSettings->ClipProperties.bAudioIsEditable)) - || (M4OSA_TRUE == pC->bRemoveOriginal) ) /*|| - (pSettings->uiAddVolume >= 100)) */ - { - pC->bAudioMixingIsNeeded = M4OSA_FALSE; - } - else - { - pC->bAudioMixingIsNeeded = M4OSA_TRUE; - } - - /** - * Check if output audio can support silence frames - Trick i use bAudioIsCompatibleWithMasterClip filed to store that */ - if( pC->bHasAudio ) - { - pC->bSupportSilence = pC->pAddedClipCtxt->pSettings-> - ClipProperties.bAudioIsCompatibleWithMasterClip; - - if( M4OSA_FALSE == pC->bSupportSilence ) - { - if( pC->iAddCts > 0 ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen():\ - iAddCts should be set to 0 with this audio track !"); - return M4VSS3GPP_ERR_FEATURE_UNSUPPORTED_WITH_AUDIO_TRACK; - } - - if( 0 < pC->uiEndLoop ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen():\ - uiEndLoop should be set to 0 with this audio track !"); - return M4VSS3GPP_ERR_FEATURE_UNSUPPORTED_WITH_AUDIO_TRACK; - } - } - } - if( pC->b_DuckingNeedeed == M4OSA_FALSE) - { - /** - * Compute the factor to apply to sample to do the mixing */ - pC->fAddedFactor = 0.50F; - pC->fOrigFactor = 0.50F; - } - - - /** - * Check if SSRC is needed */ - if( M4OSA_TRUE == pC->b_SSRCneeded ) - { - M4OSA_UInt32 numerator, denominator, ratio, ratioBuffer; - - /** - * Init the SSRC module */ - SSRC_ReturnStatus_en - ReturnStatus; /* Function return status */ - LVM_INT16 NrSamplesMin = - 0; /* Minimal number of samples on the input or on the output */ - LVM_INT32 - ScratchSize; /* The size of the scratch memory */ - LVM_INT16 - *pInputInScratch; /* Pointer to input in the scratch buffer */ - LVM_INT16 - * - pOutputInScratch; /* Pointer to the output in the scratch buffer */ - SSRC_Params_t ssrcParams; /* Memory for init parameters */ - - switch( pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiSamplingFrequency ) - { - case 8000: - ssrcParams.SSRC_Fs_In = LVM_FS_8000; - break; - - case 11025: - ssrcParams.SSRC_Fs_In = LVM_FS_11025; - break; - - case 12000: - ssrcParams.SSRC_Fs_In = LVM_FS_12000; - break; - - case 16000: - ssrcParams.SSRC_Fs_In = LVM_FS_16000; - break; - - case 22050: - ssrcParams.SSRC_Fs_In = LVM_FS_22050; - break; - - case 24000: - ssrcParams.SSRC_Fs_In = LVM_FS_24000; - break; - - case 32000: - ssrcParams.SSRC_Fs_In = LVM_FS_32000; - break; - - case 44100: - ssrcParams.SSRC_Fs_In = LVM_FS_44100; - break; - - case 48000: - ssrcParams.SSRC_Fs_In = LVM_FS_48000; - break; - - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen: invalid added clip sampling frequency (%d Hz),\ - returning M4VSS3GPP_ERR_UNSUPPORTED_ADDED_AUDIO_STREAM", - pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiSamplingFrequency); - return M4VSS3GPP_ERR_UNSUPPORTED_ADDED_AUDIO_STREAM; - } - - if( 1 == pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels ) - { - ssrcParams.SSRC_NrOfChannels = LVM_MONO; - } - else - { - ssrcParams.SSRC_NrOfChannels = LVM_STEREO; - } - - switch( pC->ewc.uiSamplingFrequency ) - { - case 8000: - ssrcParams.SSRC_Fs_Out = LVM_FS_8000; - break; - - case 16000: - ssrcParams.SSRC_Fs_Out = LVM_FS_16000; - break; - - case 22050: - ssrcParams.SSRC_Fs_Out = LVM_FS_22050; - break; - - case 24000: - ssrcParams.SSRC_Fs_Out = LVM_FS_24000; - break; - - case 32000: - ssrcParams.SSRC_Fs_Out = LVM_FS_32000; - break; - - case 44100: - ssrcParams.SSRC_Fs_Out = LVM_FS_44100; - break; - - case 48000: - ssrcParams.SSRC_Fs_Out = LVM_FS_48000; - break; - - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen: invalid output sampling frequency (%d Hz),\ - returning M4VSS3GPP_ERR_AUDIO_CANNOT_BE_MIXED", - pC->ewc.uiSamplingFrequency); - return M4VSS3GPP_ERR_AUDIO_CANNOT_BE_MIXED; - break; - } - ReturnStatus = 0; - - switch (ssrcParams.SSRC_Fs_In){ - case LVM_FS_8000: - ssrcParams.NrSamplesIn = 320; - break; - case LVM_FS_11025: - ssrcParams.NrSamplesIn =441; - break; - case LVM_FS_12000: - ssrcParams.NrSamplesIn = 480; - break; - case LVM_FS_16000: - ssrcParams.NrSamplesIn = 640; - break; - case LVM_FS_22050: - ssrcParams.NrSamplesIn = 882; - break; - case LVM_FS_24000: - ssrcParams.NrSamplesIn = 960; - break; - case LVM_FS_32000: - ssrcParams.NrSamplesIn = 1280; - break; - case LVM_FS_44100: - ssrcParams.NrSamplesIn = 1764; - break; - case LVM_FS_48000: - ssrcParams.NrSamplesIn = 1920; - break; - default: - ReturnStatus = -1; - break; - } - - switch (ssrcParams.SSRC_Fs_Out){ - case LVM_FS_8000: - ssrcParams.NrSamplesOut= 320; - break; - case LVM_FS_11025: - ssrcParams.NrSamplesOut =441; - break; - case LVM_FS_12000: - ssrcParams.NrSamplesOut= 480; - break; - case LVM_FS_16000: - ssrcParams.NrSamplesOut= 640; - break; - case LVM_FS_22050: - ssrcParams.NrSamplesOut= 882; - break; - case LVM_FS_24000: - ssrcParams.NrSamplesOut= 960; - break; - case LVM_FS_32000: - ssrcParams.NrSamplesOut = 1280; - break; - case LVM_FS_44100: - ssrcParams.NrSamplesOut= 1764; - break; - case LVM_FS_48000: - ssrcParams.NrSamplesOut = 1920; - break; - default: - ReturnStatus = -1; - break; - } - if( ReturnStatus != SSRC_OK ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen:\ - Error code %d returned by the SSRC_GetNrSamples function", - ReturnStatus); - return M4VSS3GPP_ERR_AUDIO_CANNOT_BE_MIXED; - } - - NrSamplesMin = - (LVM_INT16)((ssrcParams.NrSamplesIn > ssrcParams.NrSamplesOut) - ? ssrcParams.NrSamplesOut : ssrcParams.NrSamplesIn); - - while( NrSamplesMin < M4VSS_SSRC_MINBLOCKSIZE ) - { /* Don't take blocks smaller that the minimal block size */ - ssrcParams.NrSamplesIn = (LVM_INT16)(ssrcParams.NrSamplesIn << 1); - ssrcParams.NrSamplesOut = (LVM_INT16)(ssrcParams.NrSamplesOut << 1); - NrSamplesMin = (LVM_INT16)(NrSamplesMin << 1); - } - pC->iSsrcNbSamplIn = (LVM_INT16)( - ssrcParams. - NrSamplesIn); /* multiplication by NrOfChannels is done below */ - pC->iSsrcNbSamplOut = (LVM_INT16)(ssrcParams.NrSamplesOut); - - numerator = - pC->pAddedClipCtxt->pSettings->ClipProperties.uiSamplingFrequency - * pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels; - denominator = - pC->pInputClipCtxt->pSettings->ClipProperties.uiSamplingFrequency - * pC->pInputClipCtxt->pSettings->ClipProperties.uiNbChannels; - - if( numerator % denominator == 0 ) - { - ratioBuffer = (M4OSA_UInt32)(numerator / denominator); - } - else - { - ratioBuffer = (M4OSA_UInt32)(numerator / denominator) + 1; - } - - ratio = - (M4OSA_UInt32)(( pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize - * ratioBuffer) / (pC->iSsrcNbSamplIn * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels)); - - if( ratio == 0 ) - { - /* It means that the input size of SSRC bufferIn is bigger than the asked buffer */ - pC->minimumBufferIn = pC->iSsrcNbSamplIn * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels; - } - else - { - ratio++; /* We use the immediate superior integer */ - pC->minimumBufferIn = ratio * (pC->iSsrcNbSamplIn * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels); - } - - /** - * Allocate buffer for the input of the SSRC */ - pC->pSsrcBufferIn = - (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pC->minimumBufferIn - + pC->pAddedClipCtxt-> - AudioDecBufferOut. - m_bufferSize, - M4VSS3GPP, (M4OSA_Char *)"pSsrcBufferIn"); - - if( M4OSA_NULL == pC->pSsrcBufferIn ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen():\ - unable to allocate pSsrcBufferIn, returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - pC->pPosInSsrcBufferIn = (M4OSA_MemAddr8)pC->pSsrcBufferIn; - - /** - * Allocate buffer for the output of the SSRC */ - /* The "3" value below should be optimized ... one day ... */ - pC->pSsrcBufferOut = - (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(3 * pC->iSsrcNbSamplOut * sizeof(short) - * pC->ewc.uiNbChannels, M4VSS3GPP, (M4OSA_Char *)"pSsrcBufferOut"); - - if( M4OSA_NULL == pC->pSsrcBufferOut ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen():\ - unable to allocate pSsrcBufferOut, returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - pC->pPosInSsrcBufferOut = pC->pSsrcBufferOut; - - /** - * Allocate temporary buffer needed in case of channel conversion */ - if( pC->ChannelConversion > 0 ) - { - /* The "3" value below should be optimized ... one day ... */ - pC->pTempBuffer = - (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(3 * pC->iSsrcNbSamplOut - * sizeof(short) * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels, M4VSS3GPP, (M4OSA_Char *)"pSsrcBufferOut"); - - if( M4OSA_NULL == pC->pTempBuffer ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen():\ - unable to allocate pTempBuffer, returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - pC->pPosInTempBuffer = pC->pTempBuffer; - } - } - else if( pC->ChannelConversion > 0 ) - { - pC->minimumBufferIn = - pC->pAddedClipCtxt->AudioDecBufferOut.m_bufferSize; - - /** - * Allocate buffer for the input of the SSRC */ - pC->pSsrcBufferIn = - (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pC->minimumBufferIn - + pC->pAddedClipCtxt-> - AudioDecBufferOut. - m_bufferSize, - M4VSS3GPP, (M4OSA_Char *)"pSsrcBufferIn"); - - if( M4OSA_NULL == pC->pSsrcBufferIn ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen(): \ - unable to allocate pSsrcBufferIn, returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - pC->pPosInSsrcBufferIn = (M4OSA_MemAddr8)pC->pSsrcBufferIn; - - /** - * Allocate buffer for the output of the SSRC */ - /* The "3" value below should be optimized ... one day ... */ - pC->pSsrcBufferOut = (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc( - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize, - M4VSS3GPP, (M4OSA_Char *)"pSsrcBufferOut"); - - if( M4OSA_NULL == pC->pSsrcBufferOut ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen():\ - unable to allocate pSsrcBufferOut, returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - pC->pPosInSsrcBufferOut = pC->pSsrcBufferOut; - } - else if( (pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType == M4VIDEOEDITING_kMP3)|| - (pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType == M4VIDEOEDITING_kPCM)) - { - M4OSA_UInt32 minbuffer = 0; - - if( pSettings->outputAudioFormat == M4VIDEOEDITING_kAAC ) - { - pC->minimumBufferIn = 2048 * pC->ewc.uiNbChannels; - minbuffer = pC->minimumBufferIn; - } - else if( pSettings->outputAudioFormat == M4VIDEOEDITING_kAMR_NB ) - { - pC->minimumBufferIn = 320; - - if( pC->pAddedClipCtxt->AudioDecBufferOut.m_bufferSize > 320 ) - { - minbuffer = pC->pAddedClipCtxt->AudioDecBufferOut.m_bufferSize; - } - else - { - minbuffer = pC->minimumBufferIn; /* Not really possible ...*/ - } - } - else - { - M4OSA_TRACE1_0("Bad output audio format, in case of MP3 replacing"); - return M4ERR_PARAMETER; - } - - /** - * Allocate buffer for the input of the SSRC */ - pC->pSsrcBufferIn = - (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(2 * minbuffer, M4VSS3GPP, - (M4OSA_Char *)"pSsrcBufferIn"); - - if( M4OSA_NULL == pC->pSsrcBufferIn ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingOpen(): unable to allocate pSsrcBufferIn,\ - returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - pC->pPosInSsrcBufferIn = (M4OSA_MemAddr8)pC->pSsrcBufferIn; - - pC->pPosInSsrcBufferOut = pC->pPosInSsrcBufferIn; - pC->pSsrcBufferOut = pC->pSsrcBufferIn; - } - - /** - * Check if audio encoder is needed to do audio mixing or audio resampling */ - if( M4OSA_TRUE == pC->bAudioMixingIsNeeded || M4VIDEOEDITING_kPCM - == pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType - || M4VIDEOEDITING_kMP3 - == pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType - || pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType - != pSettings->outputAudioFormat - || pC->pAddedClipCtxt->pSettings->ClipProperties.uiSamplingFrequency - != outputASF - || pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels - != pSettings->outputNBChannels ) - { - /** - * Init the audio encoder */ - err = M4VSS3GPP_intCreateAudioEncoder(&pC->ewc, &pC->ShellAPI, - pC->ewc.uiAudioBitrate); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intCreateAudioEncoder() returns 0x%x", - err); - return err; - } - - /* In case of PCM, MP3 or audio replace with reencoding, use encoder DSI */ - if( pC->ewc.uiAudioOutputDsiSize == 0 && (M4VIDEOEDITING_kPCM - == pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType - || M4VIDEOEDITING_kMP3 == pC->pAddedClipCtxt->pSettings-> - ClipProperties.AudioStreamType - || pC->pAddedClipCtxt->pSettings-> - ClipProperties.AudioStreamType - != pSettings->outputAudioFormat - || pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiSamplingFrequency != outputASF - || pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels - != pSettings->outputNBChannels) ) - { - pC->ewc.uiAudioOutputDsiSize = - (M4OSA_UInt16)pC->ewc.pAudioEncDSI.infoSize; - pC->ewc.pAudioOutputDsi = pC->ewc.pAudioEncDSI.pInfo; - } - } - - /** - * Init the output 3GPP file */ - /*11/12/2008 CR3283 add the max output file size for the MMS use case in VideoArtist*/ - err = M4VSS3GPP_intCreate3GPPOutputFile(&pC->ewc, &pC->ShellAPI, - pC->pOsaFileWritPtr, pSettings->pOutputClipFile, - pC->pOsaFileReadPtr, pSettings->pTemporaryFile, 0); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingOpen(): M4VSS3GPP_intCreate3GPPOutputFile() returns 0x%x", - err); - return err; - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intAudioMixingOpen(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioMixingWriteSilence() - * @brief Write an audio silence frame into the writer - * @note Mainly used when padding with silence - * @param pC (IN) VSS audio mixing internal context - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intAudioMixingWriteSilence( - M4VSS3GPP_InternalAudioMixingContext *pC ) -{ - M4OSA_ERR err; - - err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1("M4VSS3GPP_intAudioMixingWriteSilence:\ - pWriterDataFcts->pStartAU(audio) returns 0x%x!", err); - return err; - } - - M4OSA_TRACE2_0("A #### silence AU"); - - memcpy((void *)pC->ewc.WriterAudioAU.dataAddress, - (void *)pC->ewc.pSilenceFrameData, pC->ewc.uiSilenceFrameSize); - - pC->ewc.WriterAudioAU.size = pC->ewc.uiSilenceFrameSize; - pC->ewc.WriterAudioAU.CTS = - (M4OSA_Time)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5); - - M4OSA_TRACE2_2("B ---- write : cts = %ld [ 0x%x ]", - (M4OSA_Int32)(pC->ewc.dATo), pC->ewc.WriterAudioAU.size); - - err = pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingWriteSilence:\ - pWriterDataFcts->pProcessAU(silence) returns 0x%x!", - err); - return err; - } - - pC->ewc.dATo += pC->ewc.iSilenceFrameDuration / pC->ewc.scale_audio; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioMixingStepVideo(M4VSS3GPP_InternalAudioMixingContext *pC) - * @brief Perform one step of video. - * @note - * @param pC (IN) VSS audio mixing internal context - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intAudioMixingStepVideo( - M4VSS3GPP_InternalAudioMixingContext *pC ) -{ - M4OSA_ERR err; - M4OSA_UInt16 offset; - - M4OSA_TRACE2_3(" VIDEO step : dVTo = %f state = %d offset = %ld", - pC->ewc.dOutputVidCts, pC->State, pC->pInputClipCtxt->iVoffset); - - /** - * Read the input video AU */ - err = pC->pInputClipCtxt->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( - pC->pInputClipCtxt->pReaderContext, - (M4_StreamHandler *)pC->pInputClipCtxt->pVideoStream, - &pC->pInputClipCtxt->VideoAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE3_1( - "M4VSS3GPP_intAudioMixingStepVideo(): m_pFctGetNextAu(video) returns 0x%x", - err); - return err; - } - - M4OSA_TRACE2_3("C .... read : cts = %.0f + %ld [ 0x%x ]", - pC->pInputClipCtxt->VideoAU.m_CTS, pC->pInputClipCtxt->iVoffset, - pC->pInputClipCtxt->VideoAU.m_size); - - /** - * Get the output AU to write into */ - err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_VIDEO_STREAM_ID, &pC->ewc.WriterVideoAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepVideo: pWriterDataFcts->pStartAU(Video) returns 0x%x!", - err); - return err; - } - - offset = 0; - /* for h.264 stream do not read the 1st 4 bytes as they are header indicators */ - if( pC->pInputClipCtxt->pVideoStream->m_basicProperties.m_streamType - == M4DA_StreamTypeVideoMpeg4Avc ) - { - M4OSA_TRACE3_0( - "M4VSS3GPP_intAudioMixingStepVideo(): input stream type H264"); - offset = 4; - } - pC->pInputClipCtxt->VideoAU.m_size -= offset; - /** - * Check that the video AU is not larger than expected */ - if( pC->pInputClipCtxt->VideoAU.m_size > pC->ewc.uiVideoMaxAuSize ) - { - M4OSA_TRACE1_2( - "M4VSS3GPP_intAudioMixingStepVideo: AU size greater than MaxAuSize (%d>%d)!\ - returning M4VSS3GPP_ERR_INPUT_VIDEO_AU_TOO_LARGE", - pC->pInputClipCtxt->VideoAU.m_size, pC->ewc.uiVideoMaxAuSize); - return M4VSS3GPP_ERR_INPUT_VIDEO_AU_TOO_LARGE; - } - - /** - * Copy the input AU payload to the output AU */ - memcpy((void *)pC->ewc.WriterVideoAU.dataAddress, - (void *)(pC->pInputClipCtxt->VideoAU.m_dataAddress + offset), - (pC->pInputClipCtxt->VideoAU.m_size)); - - /** - * Copy the input AU parameters to the output AU */ - pC->ewc.WriterVideoAU.size = pC->pInputClipCtxt->VideoAU.m_size; - pC->ewc.WriterVideoAU.CTS = - (M4OSA_UInt32)(pC->pInputClipCtxt->VideoAU.m_CTS + 0.5); - pC->ewc.WriterVideoAU.attribute = pC->pInputClipCtxt->VideoAU.m_attribute; - - /** - * Write the AU */ - M4OSA_TRACE2_2("D ---- write : cts = %lu [ 0x%x ]", - pC->ewc.WriterVideoAU.CTS, pC->ewc.WriterVideoAU.size); - - err = pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_VIDEO_STREAM_ID, &pC->ewc.WriterVideoAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepVideo: pWriterDataFcts->pProcessAU(Video) returns 0x%x!", - err); - return err; - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intAudioMixingStepVideo(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioMixingStepAudioMix(M4VSS3GPP_InternalAudioMixingContext *pC) - * @brief Perform one step of audio. - * @note - * @param pC (IN) VSS audio mixing internal context - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intAudioMixingStepAudioMix( - M4VSS3GPP_InternalAudioMixingContext *pC ) -{ - M4OSA_ERR err; - - M4OSA_TRACE2_3(" AUDIO mix : dATo = %f state = %d offset = %ld", - pC->ewc.dATo, pC->State, pC->pInputClipCtxt->iAoffset); - - switch( pC->State ) - { - /**********************************************************/ - case M4VSS3GPP_kAudioMixingState_AUDIO_FIRST_SEGMENT: - { - err = M4VSS3GPP_intAudioMixingCopyOrig(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix:\ - M4VSS3GPP_intAudioMixingCopyOrig(1) returns 0x%x!", - err); - return err; - } - - /** - * Check if we reached the AddCts */ - if( pC->ewc.dATo >= pC->iAddCts ) - { - /** - * First segment is over, state transition to second and return OK */ - pC->State = M4VSS3GPP_kAudioMixingState_AUDIO_SECOND_SEGMENT; - - /* Transition from reading state to encoding state */ - err = M4VSS3GPP_intAudioMixingTransition(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix(): pre-encode fails err = 0x%x", - err); - return err; - } - - /** - * Return with no error so the step function will be called again */ - pC->pAddedClipCtxt->iAoffset = - (M4OSA_Int32)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5); - - M4OSA_TRACE2_0( - "M4VSS3GPP_intAudioMixingStepAudioMix(): returning M4NO_ERROR (1->2)"); - - return M4NO_ERROR; - } - } - break; - - /**********************************************************/ - case M4VSS3GPP_kAudioMixingState_AUDIO_SECOND_SEGMENT: - { - if( M4OSA_TRUE == pC->bAudioMixingIsNeeded ) /**< Mix */ - { - /** - * Read the added audio AU */ - if( pC->ChannelConversion > 0 || pC->b_SSRCneeded == M4OSA_TRUE - || pC->pAddedClipCtxt->pSettings-> - ClipProperties.AudioStreamType == M4VIDEOEDITING_kMP3 ) - { - /* In case of sampling freq conversion and/or channel conversion, - the read next AU will be called by the - M4VSS3GPP_intAudioMixingDoMixing function */ - } - else - { - err = - M4VSS3GPP_intClipReadNextAudioFrame(pC->pAddedClipCtxt); - - M4OSA_TRACE2_3("E .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pAddedClipCtxt->iAudioFrameCts - / pC->pAddedClipCtxt->scale_audio, - pC->pAddedClipCtxt->iAoffset - / pC->pAddedClipCtxt->scale_audio, - pC->pAddedClipCtxt->uiAudioFrameSize); - - if( M4WAR_NO_MORE_AU == err ) - { - /** - * Decide what to do when audio is over */ - if( pC->uiEndLoop > 0 ) - { - /** - * Jump at the Begin loop time */ - M4OSA_Int32 time = (M4OSA_Int32)(pC->uiBeginLoop); - - err = pC->pAddedClipCtxt->ShellAPI.m_pReader-> - m_pFctJump( - pC->pAddedClipCtxt->pReaderContext, - (M4_StreamHandler - *)pC->pAddedClipCtxt->pAudioStream, - &time); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - m_pReader->m_pFctJump(audio returns 0x%x", - err); - return err; - } - } - else - { - /* Transition from encoding state to reading state */ - err = M4VSS3GPP_intAudioMixingTransition(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - pre-encode fails err = 0x%x", - err); - return err; - } - - /** - * Second segment is over, state transition to third and - return OK */ - pC->State = - M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT; - - /** - * Return with no error so the step function will be - called again */ - M4OSA_TRACE2_0( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - returning M4NO_ERROR (2->3) a"); - return M4NO_ERROR; - } - } - else if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - m_pFctGetNextAu(audio) returns 0x%x", - err); - return err; - } - } - - /** - * Read the original audio AU */ - err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pInputClipCtxt); - - M4OSA_TRACE2_3("F .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pInputClipCtxt->iAudioFrameCts - / pC->pInputClipCtxt->scale_audio, - pC->pInputClipCtxt->iAoffset - / pC->pInputClipCtxt->scale_audio, - pC->pInputClipCtxt->uiAudioFrameSize); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE3_1( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - m_pFctGetNextAu(audio) returns 0x%x", - err); - return err; - } - - if( pC->ChannelConversion == 0 - && pC->b_SSRCneeded == M4OSA_FALSE - && pC->pAddedClipCtxt->pSettings-> - ClipProperties.AudioStreamType != M4VIDEOEDITING_kMP3 ) - { - /** - * Get the output AU to write into */ - err = pC->ShellAPI.pWriterDataFcts->pStartAU( - pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_AUDIO_STREAM_ID, - &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix:\ - pWriterDataFcts->pStartAU(audio) returns 0x%x!", - err); - return err; - } - } - - /** - * Perform the audio mixing */ - err = M4VSS3GPP_intAudioMixingDoMixing(pC); - - if( err == M4VSS3GPP_WAR_END_OF_ADDED_AUDIO ) - { - return M4NO_ERROR; - } - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix:\ - M4VSS3GPP_intAudioMixingDoMixing returns 0x%x!", - err); - return err; - } - } - else /**< No mix, just copy added audio */ - { - err = M4VSS3GPP_intAudioMixingCopyAdded(pC); - - if( M4WAR_NO_MORE_AU == err ) - { - /** - * Decide what to do when audio is over */ - if( pC->uiEndLoop > 0 ) - { - /** - * Jump at the Begin loop time */ - M4OSA_Int32 time = (M4OSA_Int32)(pC->uiBeginLoop); - - err = - pC->pAddedClipCtxt->ShellAPI.m_pReader->m_pFctJump( - pC->pAddedClipCtxt->pReaderContext, - (M4_StreamHandler - *)pC->pAddedClipCtxt->pAudioStream, - &time); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - m_pReader->m_pFctJump(audio returns 0x%x", - err); - return err; - } - - /** - * 'BZZZ' bug fix: - * add a silence frame */ - err = M4VSS3GPP_intAudioMixingWriteSilence(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - M4VSS3GPP_intAudioMixingWriteSilence returns 0x%x", - err); - return err; - } - - /** - * Return with no error so the step function will be called again to - read audio data */ - pC->pAddedClipCtxt->iAoffset = - (M4OSA_Int32)(pC->ewc.dATo * pC->ewc.scale_audio - + 0.5); - - M4OSA_TRACE2_0( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - returning M4NO_ERROR (loop)"); - return M4NO_ERROR; - } - else - { - /* Transition to begin cut */ - err = M4VSS3GPP_intAudioMixingTransition(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - pre-encode fails err = 0x%x", - err); - return err; - } - - /** - * Second segment is over, state transition to third */ - pC->State = - M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT; - - /** - * Return with no error so the step function will be called again */ - M4OSA_TRACE2_0( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - returning M4NO_ERROR (2->3) b"); - return M4NO_ERROR; - } - } - else if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - M4VSS3GPP_intAudioMixingCopyOrig(2) returns 0x%x", - err); - return err; - } - } - - /** - * Check if we reached the end of the video */ - if( pC->ewc.dATo >= pC->ewc.iOutputDuration ) - { - M4OSA_TRACE3_0( - "M4VSS3GPP_intAudioMixingStepAudioMix(): Video duration reached,\ - returning M4WAR_NO_MORE_AU"); - return M4WAR_NO_MORE_AU; /**< Simulate end of file error */ - } - } - break; - - /**********************************************************/ - case M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT: - { - err = M4VSS3GPP_intAudioMixingCopyOrig(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix:\ - M4VSS3GPP_intAudioMixingCopyOrig(3) returns 0x%x!", - err); - return err; - } - - /** - * Check if we reached the end of the video */ - if( pC->ewc.dATo >= pC->ewc.iOutputDuration ) - { - M4OSA_TRACE3_0( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - Video duration reached, returning M4WAR_NO_MORE_AU"); - return M4WAR_NO_MORE_AU; /**< Simulate end of file error */ - } - } - break; - default: - break; - } - - /** - * Return with no error */ - M4OSA_TRACE3_0( - "M4VSS3GPP_intAudioMixingStepAudioMix(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioMixingStepAudioReplace(M4VSS3GPP_InternalAudioMixingContext *pC) - * @brief Perform one step of audio. - * @note - * @param pC (IN) VSS audio mixing internal context - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intAudioMixingStepAudioReplace( - M4VSS3GPP_InternalAudioMixingContext *pC ) -{ - M4OSA_ERR err; - - M4OSA_TRACE2_3(" AUDIO repl : dATo = %f state = %d offset = %ld", - pC->ewc.dATo, pC->State, pC->pInputClipCtxt->iAoffset); - - switch( pC->State ) - { - /**********************************************************/ - case M4VSS3GPP_kAudioMixingState_AUDIO_FIRST_SEGMENT: - { - /** - * Replace the SID (silence) payload in the writer AU */ - err = M4VSS3GPP_intAudioMixingWriteSilence(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - M4VSS3GPP_intAudioMixingWriteSilence returns 0x%x", - err); - return err; - } - - /** - * Check if we reached the AddCts */ - if( pC->ewc.dATo >= pC->iAddCts ) - { - /** - * First segment is over, state transition to second and return OK */ - pC->State = M4VSS3GPP_kAudioMixingState_AUDIO_SECOND_SEGMENT; - - /** - * Return with no error so the step function will be called again */ - pC->pAddedClipCtxt->iAoffset = - (M4OSA_Int32)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5); - - M4OSA_TRACE2_0("M4VSS3GPP_intAudioMixingStepAudioReplace():\ - returning M4NO_ERROR (1->2)"); - return M4NO_ERROR; - } - } - break; - - /**********************************************************/ - case M4VSS3GPP_kAudioMixingState_AUDIO_SECOND_SEGMENT: - { - err = M4VSS3GPP_intAudioMixingCopyAdded(pC); - - if( M4WAR_NO_MORE_AU == err ) - { - /** - * Decide what to do when audio is over */ - - if( pC->uiEndLoop > 0 ) - { - /** - * Jump at the Begin loop time */ - M4OSA_Int32 time = (M4OSA_Int32)(pC->uiBeginLoop); - - err = pC->pAddedClipCtxt->ShellAPI.m_pReader->m_pFctJump( - pC->pAddedClipCtxt->pReaderContext, - (M4_StreamHandler - *)pC->pAddedClipCtxt->pAudioStream, &time); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioReplace():\ - m_pReader->m_pFctJump(audio returns 0x%x", - err); - return err; - } - - /** - * 'BZZZ' bug fix: - * add a silence frame */ - err = M4VSS3GPP_intAudioMixingWriteSilence(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - M4VSS3GPP_intAudioMixingWriteSilence returns 0x%x", - err); - return err; - } - - /** - * Return with no error so the step function will be called again to - read audio data */ - pC->pAddedClipCtxt->iAoffset = - (M4OSA_Int32)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5); - - M4OSA_TRACE2_0( - "M4VSS3GPP_intAudioMixingStepAudioReplace():\ - returning M4NO_ERROR (loop)"); - - return M4NO_ERROR; - } - else if( M4OSA_TRUE == pC->bSupportSilence ) - { - /** - * Second segment is over, state transition to third and return OK */ - pC->State = M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT; - - /** - * Return with no error so the step function will be called again */ - M4OSA_TRACE2_0( - "M4VSS3GPP_intAudioMixingStepAudioReplace():\ - returning M4NO_ERROR (2->3)"); - return M4NO_ERROR; - } - else - { - /** - * The third segment (silence) is only done if supported. - * In other case, we finish here. */ - pC->State = M4VSS3GPP_kAudioMixingState_FINISHED; - - /** - * Return with no error so the step function will be called again */ - M4OSA_TRACE2_0( - "M4VSS3GPP_intAudioMixingStepAudioReplace():\ - returning M4NO_ERROR (2->F)"); - return M4NO_ERROR; - } - } - else if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioReplace():\ - M4VSS3GPP_intAudioMixingCopyOrig(2) returns 0x%x", - err); - return err; - } - - /** - * Check if we reached the end of the clip */ - if( pC->ewc.dATo >= pC->ewc.iOutputDuration ) - { - M4OSA_TRACE3_0( - "M4VSS3GPP_intAudioMixingStepAudioReplace(): Clip duration reached,\ - returning M4WAR_NO_MORE_AU"); - return M4WAR_NO_MORE_AU; /**< Simulate end of file error */ - } - } - break; - - /**********************************************************/ - case M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT: - { - /** - * Replace the SID (silence) payload in the writer AU */ - err = M4VSS3GPP_intAudioMixingWriteSilence(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix():\ - M4VSS3GPP_intAudioMixingWriteSilence returns 0x%x", - err); - return err; - } - - /** - * Check if we reached the end of the video */ - if( pC->ewc.dATo >= pC->ewc.iOutputDuration ) - { - M4OSA_TRACE3_0( - "M4VSS3GPP_intAudioMixingStepAudioReplace():\ - Video duration reached, returning M4WAR_NO_MORE_AU"); - return M4WAR_NO_MORE_AU; /**< Simulate end of file error */ - } - } - break; - default: - break; - } - - /** - * Return with no error */ - M4OSA_TRACE3_0( - "M4VSS3GPP_intAudioMixingStepAudioReplace(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioMixingCopyOrig(M4VSS3GPP_InternalAudioMixingContext *pC) - * @brief Read one AU from the original audio file and write it to the output - * @note - * @param pC (IN) VSS audio mixing internal context - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intAudioMixingCopyOrig( - M4VSS3GPP_InternalAudioMixingContext *pC ) -{ - M4OSA_ERR err; - - /** - * Read the input original audio AU */ - err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pInputClipCtxt); - - M4OSA_TRACE2_3("G .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pInputClipCtxt->iAudioFrameCts / pC->pInputClipCtxt->scale_audio, - pC->pInputClipCtxt->iAoffset / pC->pInputClipCtxt->scale_audio, - pC->pInputClipCtxt->uiAudioFrameSize); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE3_1( - "M4VSS3GPP_intAudioMixingCopyOrig(): m_pFctGetNextAu(audio) returns 0x%x", - err); - return err; - } - - /** - * Get the output AU to write into */ - err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingCopyOrig: pWriterDataFcts->pStartAU(audio) returns 0x%x!", - err); - return err; - } - - /** - * Copy the input AU properties to the output AU */ - pC->ewc.WriterAudioAU.size = pC->pInputClipCtxt->uiAudioFrameSize; - pC->ewc.WriterAudioAU.CTS = - pC->pInputClipCtxt->iAudioFrameCts + pC->pInputClipCtxt->iAoffset; - - /** - * Copy the AU itself */ - memcpy((void *)pC->ewc.WriterAudioAU.dataAddress, - (void *)pC->pInputClipCtxt->pAudioFramePtr, pC->ewc.WriterAudioAU.size); - - /** - * Write the mixed AU */ - M4OSA_TRACE2_2("H ---- write : cts = %ld [ 0x%x ]", - (M4OSA_Int32)(pC->ewc.WriterAudioAU.CTS / pC->ewc.scale_audio), - pC->ewc.WriterAudioAU.size); - - err = pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingCopyOrig: pWriterDataFcts->pProcessAU(audio) returns 0x%x!", - err); - return err; - } - - /** - * Increment the audio CTS for the next step */ - pC->ewc.dATo += pC->ewc.iSilenceFrameDuration / pC->ewc.scale_audio; - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intAudioMixingCopyOrig(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioMixingCopyAdded(M4VSS3GPP_InternalAudioMixingContext *pC) - * @brief Read one AU from the added audio file and write it to the output - * @note - * @param pC (IN) VSS audio mixing internal context - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intAudioMixingCopyAdded( - M4VSS3GPP_InternalAudioMixingContext *pC ) -{ - M4OSA_ERR err; - - if(pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType == M4VIDEOEDITING_kMP3 || - pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType == M4VIDEOEDITING_kPCM || - pC->b_SSRCneeded == M4OSA_TRUE || - pC->ChannelConversion > 0) - { - M4ENCODER_AudioBuffer pEncInBuffer; /**< Encoder input buffer for api */ - M4ENCODER_AudioBuffer - pEncOutBuffer; /**< Encoder output buffer for api */ - M4OSA_Time - frameTimeDelta; /**< Duration of the encoded (then written) data */ - M4OSA_MemAddr8 tempPosBuffer; - - err = M4VSS3GPP_intAudioMixingConvert(pC); - - if( err == M4VSS3GPP_WAR_END_OF_ADDED_AUDIO ) - { - M4OSA_TRACE2_0( - "M4VSS3GPP_intAudioMixingCopyAdded:\ - M4VSS3GPP_intAudioMixingConvert end of added file"); - return M4NO_ERROR; - } - else if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1("M4VSS3GPP_intAudioMixingCopyAdded:\ - M4VSS3GPP_intAudioMixingConvert returned 0x%x", err); - return err; - } - - /** - * Get the output AU to write into */ - err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix:\ - pWriterDataFcts->pStartAU(audio) returns 0x%x!", - err); - return err; - } - - /* [Mono] or [Stereo interleaved] : all is in one buffer */ - pEncInBuffer.pTableBuffer[0] = pC->pSsrcBufferOut; - pEncInBuffer.pTableBufferSize[0] = - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize; - pEncInBuffer.pTableBuffer[1] = M4OSA_NULL; - pEncInBuffer.pTableBufferSize[1] = 0; - - /* Time in ms from data size, because it is PCM16 samples */ - frameTimeDelta = pEncInBuffer.pTableBufferSize[0] / sizeof(short) - / pC->ewc.uiNbChannels; - - /** - * Prepare output buffer */ - pEncOutBuffer.pTableBuffer[0] = - (M4OSA_MemAddr8)pC->ewc.WriterAudioAU.dataAddress; - pEncOutBuffer.pTableBufferSize[0] = 0; - - M4OSA_TRACE2_0("K **** blend AUs"); - /** - * Encode the PCM audio */ - - err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctStep( - pC->ewc.pAudioEncCtxt, &pEncInBuffer, &pEncOutBuffer); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingDoMixing():\ - pAudioEncoderGlobalFcts->pFctStep returns 0x%x", - err); - return err; - } - - /** - * Set AU cts and size */ - pC->ewc.WriterAudioAU.size = - pEncOutBuffer. - pTableBufferSize[0]; /**< Get the size of encoded data */ - pC->ewc.WriterAudioAU.CTS += frameTimeDelta; - - /* Update decoded buffer here */ - if( M4OSA_TRUE == pC->b_SSRCneeded || pC->ChannelConversion > 0 ) - { - tempPosBuffer = pC->pSsrcBufferOut - + pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize; - memmove((void *)pC->pSsrcBufferOut, (void *)tempPosBuffer, - pC->pPosInSsrcBufferOut - tempPosBuffer); - pC->pPosInSsrcBufferOut -= - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize; - } - else - { - tempPosBuffer = pC->pSsrcBufferIn + pC->minimumBufferIn; - memmove((void *)pC->pSsrcBufferIn, (void *)tempPosBuffer, - pC->pPosInSsrcBufferIn - tempPosBuffer); - pC->pPosInSsrcBufferIn -= pC->minimumBufferIn; - } - - /** - * Write the mixed AU */ - M4OSA_TRACE2_2("J ---- write : cts = %ld [ 0x%x ]", - (M4OSA_Int32)(pC->ewc.WriterAudioAU.CTS / pC->ewc.scale_audio), - pC->ewc.WriterAudioAU.size); - - err = - pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingCopyAdded:\ - pWriterDataFcts->pProcessAU(audio) returns 0x%x!", - err); - return err; - } - - /** - * Increment the audio CTS for the next step */ - pC->ewc.dATo += frameTimeDelta / pC->ewc.scale_audio; - } - else - { - /** - * Read the added audio AU */ - err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pAddedClipCtxt); - - M4OSA_TRACE2_3("I .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pAddedClipCtxt->iAudioFrameCts - / pC->pAddedClipCtxt->scale_audio, - pC->pAddedClipCtxt->iAoffset / pC->pAddedClipCtxt->scale_audio, - pC->pAddedClipCtxt->uiAudioFrameSize); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE3_1( - "M4VSS3GPP_intAudioMixingCopyAdded(): m_pFctGetNextAu(audio) returns 0x%x", - err); - return err; - } - - /** - * Get the output AU to write into */ - err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingCopyAdded:\ - pWriterDataFcts->pStartAU(audio) returns 0x%x!", - err); - return err; - } - - /** - * Copy the input AU properties to the output AU */ - - /** THE CHECK BELOW IS ADDED TO PREVENT ISSUES LINKED TO PRE-ALLOCATED MAX AU SIZE - max AU size is set based on M4VSS3GPP_AUDIO_MAX_AU_SIZE defined in file - M4VSS3GPP_InternalConfig.h, If this error occurs increase the limit set in this file - */ - if( pC->pAddedClipCtxt->uiAudioFrameSize > pC->ewc.WriterAudioAU.size ) - { - M4OSA_TRACE1_2( - "ERROR: audio AU size (%d) to copy larger than allocated one (%d) => abort", - pC->pAddedClipCtxt->uiAudioFrameSize, - pC->ewc.WriterAudioAU.size); - M4OSA_TRACE1_0( - "PLEASE CONTACT SUPPORT TO EXTEND MAX AU SIZE IN THE PRODUCT LIBRARY"); - err = M4ERR_UNSUPPORTED_MEDIA_TYPE; - return err; - } - pC->ewc.WriterAudioAU.size = pC->pAddedClipCtxt->uiAudioFrameSize; - pC->ewc.WriterAudioAU.CTS = - pC->pAddedClipCtxt->iAudioFrameCts + pC->pAddedClipCtxt->iAoffset; - - /** - * Copy the AU itself */ - memcpy((void *)pC->ewc.WriterAudioAU.dataAddress, - (void *)pC->pAddedClipCtxt->pAudioFramePtr, pC->ewc.WriterAudioAU.size); - - /** - * Write the mixed AU */ - M4OSA_TRACE2_2("J ---- write : cts = %ld [ 0x%x ]", - (M4OSA_Int32)(pC->ewc.WriterAudioAU.CTS / pC->ewc.scale_audio), - pC->ewc.WriterAudioAU.size); - - err = - pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingCopyAdded:\ - pWriterDataFcts->pProcessAU(audio) returns 0x%x!", - err); - return err; - } - - /** - * Increment the audio CTS for the next step */ - pC->ewc.dATo += pC->ewc.iSilenceFrameDuration / pC->ewc.scale_audio; - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intAudioMixingCopyAdded(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioMixingConvert(M4VSS3GPP_InternalAudioMixingContext *pC) - * @brief Convert PCM of added track to the right ASF / nb of Channels - * @note - * @param pC (IN) VSS audio mixing internal context - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intAudioMixingConvert( - M4VSS3GPP_InternalAudioMixingContext *pC ) -{ - M4OSA_ERR err; - int ssrcErr; /**< Error while ssrc processing */ - M4OSA_UInt32 uiChannelConvertorNbSamples = - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize / sizeof(short) - / pC->pInputClipCtxt->pSettings->ClipProperties.uiNbChannels; - M4OSA_MemAddr8 tempPosBuffer; - - M4OSA_UInt32 outFrameCount = uiChannelConvertorNbSamples; - /* Do we need to feed SSRC buffer In ? */ - /** - * RC: This is not really optimum (memmove). We should handle this with linked list. */ - while( pC->pPosInSsrcBufferIn - pC->pSsrcBufferIn < (M4OSA_Int32)pC->minimumBufferIn ) - { - /* We need to get more PCM data */ - if (pC->bNoLooping == M4OSA_TRUE) - { - err = M4WAR_NO_MORE_AU; - } - else - { - err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pAddedClipCtxt); - } - if(pC->bjumpflag) - { - /** - * Jump at the Begin loop time */ - M4OSA_Int32 time = (M4OSA_Int32)(pC->uiBeginLoop); - - err = - pC->pAddedClipCtxt->ShellAPI.m_pReader->m_pFctJump\ - (pC->pAddedClipCtxt->pReaderContext, - (M4_StreamHandler*)pC->pAddedClipCtxt->pAudioStream, &time); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4VSS3GPP_intAudioMixingConvert():\ - m_pReader->m_pFctJump(audio returns 0x%x", err); - return err; - } - pC->bjumpflag = M4OSA_FALSE; - } - M4OSA_TRACE2_3("E .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pAddedClipCtxt->iAudioFrameCts / pC->pAddedClipCtxt->scale_audio, - pC->pAddedClipCtxt->iAoffset / pC->pAddedClipCtxt->scale_audio, - pC->pAddedClipCtxt->uiAudioFrameSize); - if( M4WAR_NO_MORE_AU == err ) - { - if(pC->bNoLooping == M4OSA_TRUE) - { - pC->uiEndLoop =0; /* Value 0 means no looping is required */ - } - /** - * Decide what to do when audio is over */ - if( pC->uiEndLoop > 0 ) - { - /** - * Jump at the Begin loop time */ - M4OSA_Int32 time = (M4OSA_Int32)(pC->uiBeginLoop); - - err = pC->pAddedClipCtxt->ShellAPI.m_pReader->m_pFctJump( - pC->pAddedClipCtxt->pReaderContext, - (M4_StreamHandler *)pC->pAddedClipCtxt-> - pAudioStream, &time); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingConvert():\ - m_pReader->m_pFctJump(audio returns 0x%x", - err); - return err; - } - } - else - { - /* Transition from encoding state to reading state */ - err = M4VSS3GPP_intAudioMixingTransition(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix(): pre-encode fails err = 0x%x", - err); - return err; - } - - /** - * Second segment is over, state transition to third and return OK */ - pC->State = M4VSS3GPP_kAudioMixingState_AUDIO_THIRD_SEGMENT; - - /** - * Return with no error so the step function will be called again */ - M4OSA_TRACE2_0( - "M4VSS3GPP_intAudioMixingConvert():\ - returning M4VSS3GPP_WAR_END_OF_ADDED_AUDIO (2->3) a"); - return M4VSS3GPP_WAR_END_OF_ADDED_AUDIO; - } - } - else if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingConvert(): m_pFctGetNextAu(audio) returns 0x%x", - err); - return err; - } - - err = M4VSS3GPP_intClipDecodeCurrentAudioFrame(pC->pAddedClipCtxt); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingDoMixing:\ - M4VSS3GPP_intClipDecodeCurrentAudioFrame(added) returns 0x%x", - err); - return M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AU; - } - - /* Copy decoded data into SSRC buffer in */ - memcpy((void *)pC->pPosInSsrcBufferIn, - (void *)pC->pAddedClipCtxt->AudioDecBufferOut.m_dataAddress, - pC->pAddedClipCtxt->AudioDecBufferOut.m_bufferSize); - /* Update position pointer into SSRC buffer In */ - - pC->pPosInSsrcBufferIn += - pC->pAddedClipCtxt->AudioDecBufferOut.m_bufferSize; - } - - /* Do the resampling / channel conversion if needed (=feed buffer out) */ - if( pC->b_SSRCneeded == M4OSA_TRUE ) - { - pC->ChannelConversion = 0; - if( pC->ChannelConversion > 0 ) - { - while( pC->pPosInTempBuffer - pC->pTempBuffer - < (M4OSA_Int32)(pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize - *pC->pAddedClipCtxt->pSettings->ClipProperties.uiNbChannels) - / pC->ChannelConversion ) - /* We use ChannelConversion variable because in case 2, we need twice less data */ - { - ssrcErr = 0; - memset((void *)pC->pPosInTempBuffer,0, - (pC->iSsrcNbSamplOut * sizeof(short) * pC->ewc.uiNbChannels)); - - LVAudioresample_LowQuality((short*)pC->pPosInTempBuffer, - (short*)pC->pSsrcBufferIn, - pC->iSsrcNbSamplOut, - pC->pLVAudioResampler); - if( 0 != ssrcErr ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingConvert: SSRC_Process returns 0x%x, returning ", - ssrcErr); - return ssrcErr; - } - - pC->pPosInTempBuffer += pC->iSsrcNbSamplOut * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels; - - /* Update SSRC bufferIn */ - tempPosBuffer = - pC->pSsrcBufferIn + (pC->iSsrcNbSamplIn * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels); - memmove((void *)pC->pSsrcBufferIn, (void *)tempPosBuffer, - pC->pPosInSsrcBufferIn - tempPosBuffer); - pC->pPosInSsrcBufferIn -= pC->iSsrcNbSamplIn * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels; - } - } - else - { - while( pC->pPosInSsrcBufferOut - pC->pSsrcBufferOut - < (M4OSA_Int32)pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize ) - { - ssrcErr = 0; - memset((void *)pC->pPosInSsrcBufferOut,0, - (pC->iSsrcNbSamplOut * sizeof(short) * pC->ewc.uiNbChannels)); - - LVAudioresample_LowQuality((short*)pC->pPosInSsrcBufferOut, - (short*)pC->pSsrcBufferIn, - pC->iSsrcNbSamplOut, - pC->pLVAudioResampler); - if( 0 != ssrcErr ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingConvert: SSRC_Process returns 0x%x, returning ", - ssrcErr); - return ssrcErr; - } - pC->pPosInSsrcBufferOut += - pC->iSsrcNbSamplOut * sizeof(short) * pC->ewc.uiNbChannels; - - /* Update SSRC bufferIn */ - tempPosBuffer = - pC->pSsrcBufferIn + (pC->iSsrcNbSamplIn * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels); - memmove((void *)pC->pSsrcBufferIn, (void *)tempPosBuffer, - pC->pPosInSsrcBufferIn - tempPosBuffer); - pC->pPosInSsrcBufferIn -= pC->iSsrcNbSamplIn * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels; - } - } - - /* Convert Stereo<->Mono */ - switch( pC->ChannelConversion ) - { - case 0: /* No channel conversion */ - break; - - case 1: /* stereo to mono */ - if( pC->pPosInSsrcBufferOut - pC->pSsrcBufferOut - < (M4OSA_Int32)pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize ) - { - From2iToMono_16((short *)pC->pTempBuffer, - (short *)pC->pSsrcBufferOut, - (short)(uiChannelConvertorNbSamples)); - /* Update pTempBuffer */ - tempPosBuffer = pC->pTempBuffer - + (uiChannelConvertorNbSamples * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties. - uiNbChannels); /* Buffer is in bytes */ - memmove((void *)pC->pTempBuffer, (void *)tempPosBuffer, - pC->pPosInTempBuffer - tempPosBuffer); - pC->pPosInTempBuffer -= - (uiChannelConvertorNbSamples * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels); - pC->pPosInSsrcBufferOut += - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize; - } - break; - - case 2: /* mono to stereo */ - if( pC->pPosInSsrcBufferOut - pC->pSsrcBufferOut - < (M4OSA_Int32)pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize ) - { - MonoTo2I_16((short *)pC->pTempBuffer, - (short *)pC->pSsrcBufferOut, - (short)uiChannelConvertorNbSamples); - tempPosBuffer = pC->pTempBuffer - + (uiChannelConvertorNbSamples * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels); - memmove((void *)pC->pTempBuffer, (void *)tempPosBuffer, - pC->pPosInTempBuffer - tempPosBuffer); - pC->pPosInTempBuffer -= - (uiChannelConvertorNbSamples * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels); - pC->pPosInSsrcBufferOut += - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize; - } - break; - } - } - else if( pC->ChannelConversion > 0 ) - { - //M4OSA_UInt32 uiChannelConvertorNbSamples = - // pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize / sizeof(short) / - // pC->pInputClipCtxt->pSettings->ClipProperties.uiNbChannels; - /* Convert Stereo<->Mono */ - switch( pC->ChannelConversion ) - { - case 0: /* No channel conversion */ - break; - - case 1: /* stereo to mono */ - if( pC->pPosInSsrcBufferOut - pC->pSsrcBufferOut - < (M4OSA_Int32)pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize ) - { - From2iToMono_16((short *)pC->pSsrcBufferIn, - (short *)pC->pSsrcBufferOut, - (short)(uiChannelConvertorNbSamples)); - /* Update pTempBuffer */ - tempPosBuffer = pC->pSsrcBufferIn - + (uiChannelConvertorNbSamples * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties. - uiNbChannels); /* Buffer is in bytes */ - memmove((void *)pC->pSsrcBufferIn, (void *)tempPosBuffer, - pC->pPosInSsrcBufferIn - tempPosBuffer); - pC->pPosInSsrcBufferIn -= - (uiChannelConvertorNbSamples * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels); - pC->pPosInSsrcBufferOut += - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize; - } - break; - - case 2: /* mono to stereo */ - if( pC->pPosInSsrcBufferOut - pC->pSsrcBufferOut - < (M4OSA_Int32)pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize ) - { - MonoTo2I_16((short *)pC->pSsrcBufferIn, - (short *)pC->pSsrcBufferOut, - (short)uiChannelConvertorNbSamples); - tempPosBuffer = pC->pSsrcBufferIn - + (uiChannelConvertorNbSamples * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels); - memmove((void *)pC->pSsrcBufferIn, (void *)tempPosBuffer, - pC->pPosInSsrcBufferIn - tempPosBuffer); - pC->pPosInSsrcBufferIn -= - (uiChannelConvertorNbSamples * sizeof(short) - * pC->pAddedClipCtxt->pSettings-> - ClipProperties.uiNbChannels); - pC->pPosInSsrcBufferOut += - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize; - } - break; - } - } - else - { - /* No channel conversion nor sampl. freq. conversion needed, just buffer management */ - pC->pPosInSsrcBufferOut = pC->pPosInSsrcBufferIn; - } - - return M4NO_ERROR; -} - -M4OSA_Int32 M4VSS3GPP_getDecibelSound( M4OSA_UInt32 value ) - { - int dbSound = 1; - - if( value == 0 ) - return 0; - - if( value > 0x4000 && value <= 0x8000 ) // 32768 - dbSound = 90; - - else if( value > 0x2000 && value <= 0x4000 ) // 16384 - dbSound = 84; - - else if( value > 0x1000 && value <= 0x2000 ) // 8192 - dbSound = 78; - - else if( value > 0x0800 && value <= 0x1000 ) // 4028 - dbSound = 72; - - else if( value > 0x0400 && value <= 0x0800 ) // 2048 - dbSound = 66; - - else if( value > 0x0200 && value <= 0x0400 ) // 1024 - dbSound = 60; - - else if( value > 0x0100 && value <= 0x0200 ) // 512 - dbSound = 54; - - else if( value > 0x0080 && value <= 0x0100 ) // 256 - dbSound = 48; - - else if( value > 0x0040 && value <= 0x0080 ) // 128 - dbSound = 42; - - else if( value > 0x0020 && value <= 0x0040 ) // 64 - dbSound = 36; - - else if( value > 0x0010 && value <= 0x0020 ) // 32 - dbSound = 30; - - else if( value > 0x0008 && value <= 0x0010 ) //16 - dbSound = 24; - - else if( value > 0x0007 && value <= 0x0008 ) //8 - dbSound = 24; - - else if( value > 0x0003 && value <= 0x0007 ) // 4 - dbSound = 18; - - else if( value > 0x0001 && value <= 0x0003 ) //2 - dbSound = 12; - - else if( value > 0x000 && value <= 0x0001 ) // 1 - dbSound = 6; - - else - dbSound = 0; - - return dbSound; - } -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioMixingDoMixing(M4VSS3GPP_InternalAudioMixingContext *pC) - * @brief Mix the current audio AUs (decoder, mix, encode) - * @note - * @param pC (IN) VSS audio mixing internal context - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intAudioMixingDoMixing( - M4VSS3GPP_InternalAudioMixingContext *pC ) -{ - M4OSA_ERR err; - M4OSA_Int16 *pPCMdata1; - M4OSA_Int16 *pPCMdata2; - M4OSA_UInt32 uiPCMsize; - - M4ENCODER_AudioBuffer pEncInBuffer; /**< Encoder input buffer for api */ - M4ENCODER_AudioBuffer pEncOutBuffer; /**< Encoder output buffer for api */ - M4OSA_Time - frameTimeDelta; /**< Duration of the encoded (then written) data */ - M4OSA_MemAddr8 tempPosBuffer; - /* ducking variable */ - M4OSA_UInt16 loopIndex = 0; - M4OSA_Int16 *pPCM16Sample = M4OSA_NULL; - M4OSA_Int32 peakDbValue = 0; - M4OSA_Int32 previousDbValue = 0; - M4OSA_UInt32 i; - - /** - * Decode original audio track AU */ - - err = M4VSS3GPP_intClipDecodeCurrentAudioFrame(pC->pInputClipCtxt); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingDoMixing:\ - M4VSS3GPP_intClipDecodeCurrentAudioFrame(orig) returns 0x%x", - err); - return M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AU; - } - - if( M4OSA_TRUE == pC->b_SSRCneeded || pC->ChannelConversion > 0 - || pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType - == M4VIDEOEDITING_kMP3 ) - { - err = M4VSS3GPP_intAudioMixingConvert(pC); - - if( err == M4VSS3GPP_WAR_END_OF_ADDED_AUDIO ) - { - return err; - } - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingDoMixing: M4VSS3GPP_intAudioMixingConvert returned 0x%x", - err); - return M4VSS3GPP_ERR_AUDIO_DECODED_PCM_SIZE_ISSUE; - } - - /** - * Get the output AU to write into */ - err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingStepAudioMix:\ - pWriterDataFcts->pStartAU(audio) returns 0x%x!", - err); - return err; - } - - pPCMdata2 = (M4OSA_Int16 *)pC->pSsrcBufferOut; - } - else - { - /** - * Decode added audio track AU */ - err = M4VSS3GPP_intClipDecodeCurrentAudioFrame(pC->pAddedClipCtxt); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingDoMixing:\ - M4VSS3GPP_intClipDecodeCurrentAudioFrame(added) returns 0x%x", - err); - return M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AU; - } - - /** - * Check both clips decoded the same amount of PCM samples */ - if( pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize - != pC->pAddedClipCtxt->AudioDecBufferOut.m_bufferSize ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingDoMixing:\ - both clips AU must have the same decoded PCM size!"); - return M4VSS3GPP_ERR_AUDIO_DECODED_PCM_SIZE_ISSUE; - } - pPCMdata2 = (M4OSA_Int16 *)pC->pAddedClipCtxt->AudioDecBufferOut.m_dataAddress; - } - - /** - * Mix the two decoded PCM audios */ - pPCMdata1 = - (M4OSA_Int16 *)pC->pInputClipCtxt->AudioDecBufferOut.m_dataAddress; - uiPCMsize = pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize - / 2; /*buffer size (bytes) to number of sample (int16)*/ - - if( pC->b_DuckingNeedeed ) - { - loopIndex = 0; - peakDbValue = 0; - previousDbValue = peakDbValue; - - pPCM16Sample = (M4OSA_Int16 *)pC->pInputClipCtxt-> - AudioDecBufferOut.m_dataAddress; - - //Calculate the peak value - while( loopIndex - < pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize - / sizeof(M4OSA_Int16) ) - { - if( pPCM16Sample[loopIndex] >= 0 ) - { - peakDbValue = previousDbValue > pPCM16Sample[loopIndex] - ? previousDbValue : pPCM16Sample[loopIndex]; - previousDbValue = peakDbValue; - } - else - { - peakDbValue = previousDbValue > -pPCM16Sample[loopIndex] - ? previousDbValue : -pPCM16Sample[loopIndex]; - previousDbValue = peakDbValue; - } - loopIndex++; - } - - pC->audioVolumeArray[pC->audVolArrIndex] = - M4VSS3GPP_getDecibelSound(peakDbValue); - - /* WINDOW_SIZE is 10 by default and check for threshold is done after 10 cycles */ - if( pC->audVolArrIndex >= WINDOW_SIZE - 1 ) - { - pC->bDoDucking = - M4VSS3GPP_isThresholdBreached((M4OSA_Int32 *)&(pC->audioVolumeArray), - pC->audVolArrIndex, pC->InDucking_threshold); - - pC->audVolArrIndex = 0; - } - else - { - pC->audVolArrIndex++; - } - - /* - *Below logic controls the mixing weightage for Background Track and Primary Track - *for the duration of window under analysis to give fade-out for Background and fade-in - *for primary - * - *Current fading factor is distributed in equal range over the defined window size. - * - *For a window size = 25 (500 ms (window under analysis) / 20 ms (sample duration)) - * - */ - - if( pC->bDoDucking ) - { - if( pC->duckingFactor - > pC->InDucking_lowVolume ) // FADE OUT BG Track - { - // decrement ducking factor in total steps in factor of low volume steps to reach - // low volume level - pC->duckingFactor -= (pC->InDucking_lowVolume); - } - else - { - pC->duckingFactor = pC->InDucking_lowVolume; - } - } - else - { - if( pC->duckingFactor < 1.0 ) // FADE IN BG Track - { - // increment ducking factor in total steps of low volume factor to reach - // orig.volume level - pC->duckingFactor += (pC->InDucking_lowVolume); - } - else - { - pC->duckingFactor = 1.0; - } - } - /* endif - ducking_enable */ - - /* Mixing Logic */ - - while( uiPCMsize-- > 0 ) - { - M4OSA_Int32 temp; - - /* set vol factor for BT and PT */ - *pPCMdata2 = (M4OSA_Int16)(*pPCMdata2 * pC->fBTVolLevel); - - *pPCMdata1 = (M4OSA_Int16)(*pPCMdata1 * pC->fPTVolLevel); - - /* mix the two samples */ - - *pPCMdata2 = (M4OSA_Int16)(( *pPCMdata2) * (pC->duckingFactor)); - *pPCMdata1 = (M4OSA_Int16)(*pPCMdata2 / 2 + *pPCMdata1 / 2); - - - if( *pPCMdata1 < 0 ) - { - temp = -( *pPCMdata1) - * 2; // bring to same Amplitude level as it was original - - if( temp > 32767 ) - { - *pPCMdata1 = -32766; // less then max allowed value - } - else - { - *pPCMdata1 = (M4OSA_Int16)(-temp); - } - } - else - { - temp = ( *pPCMdata1) - * 2; // bring to same Amplitude level as it was original - - if( temp > 32768 ) - { - *pPCMdata1 = 32767; // less than max allowed value - } - else - { - *pPCMdata1 = (M4OSA_Int16)temp; - } - } - - pPCMdata2++; - pPCMdata1++; - } - } - else - { - while( uiPCMsize-- > 0 ) - { - /* mix the two samples */ - *pPCMdata1 = (M4OSA_Int16)(*pPCMdata1 * pC->fOrigFactor * pC->fPTVolLevel - + *pPCMdata2 * pC->fAddedFactor * pC->fBTVolLevel ); - - pPCMdata1++; - pPCMdata2++; - } - } - - /* Update pC->pSsrcBufferOut buffer */ - - if( M4OSA_TRUE == pC->b_SSRCneeded || pC->ChannelConversion > 0 ) - { - tempPosBuffer = pC->pSsrcBufferOut - + pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize; - memmove((void *)pC->pSsrcBufferOut, (void *)tempPosBuffer, - pC->pPosInSsrcBufferOut - tempPosBuffer); - pC->pPosInSsrcBufferOut -= - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize; - } - else if( pC->pAddedClipCtxt->pSettings->ClipProperties.AudioStreamType - == M4VIDEOEDITING_kMP3 ) - { - tempPosBuffer = pC->pSsrcBufferIn - + pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize; - memmove((void *)pC->pSsrcBufferIn, (void *)tempPosBuffer, - pC->pPosInSsrcBufferIn - tempPosBuffer); - pC->pPosInSsrcBufferIn -= - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize; - } - - /* [Mono] or [Stereo interleaved] : all is in one buffer */ - pEncInBuffer.pTableBuffer[0] = - pC->pInputClipCtxt->AudioDecBufferOut.m_dataAddress; - pEncInBuffer.pTableBufferSize[0] = - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize; - pEncInBuffer.pTableBuffer[1] = M4OSA_NULL; - pEncInBuffer.pTableBufferSize[1] = 0; - - /* Time in ms from data size, because it is PCM16 samples */ - frameTimeDelta = - pEncInBuffer.pTableBufferSize[0] / sizeof(short) / pC->ewc.uiNbChannels; - - /** - * Prepare output buffer */ - pEncOutBuffer.pTableBuffer[0] = - (M4OSA_MemAddr8)pC->ewc.WriterAudioAU.dataAddress; - pEncOutBuffer.pTableBufferSize[0] = 0; - - M4OSA_TRACE2_0("K **** blend AUs"); - - /** - * Encode the PCM audio */ - err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctStep(pC->ewc.pAudioEncCtxt, - &pEncInBuffer, &pEncOutBuffer); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingDoMixing(): pAudioEncoderGlobalFcts->pFctStep returns 0x%x", - err); - return err; - } - - /** - * Set AU cts and size */ - pC->ewc.WriterAudioAU.size = - pEncOutBuffer.pTableBufferSize[0]; /**< Get the size of encoded data */ - pC->ewc.WriterAudioAU.CTS += frameTimeDelta; - - /** - * Write the AU */ - M4OSA_TRACE2_2("L ---- write : cts = %ld [ 0x%x ]", - (M4OSA_Int32)(pC->ewc.WriterAudioAU.CTS / pC->ewc.scale_audio), - pC->ewc.WriterAudioAU.size); - - err = pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_AUDIO_STREAM_ID, &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingDoMixing: pWriterDataFcts->pProcessAU returns 0x%x!", - err); - return err; - } - - /** - * Increment the audio CTS for the next step */ - pC->ewc.dATo += frameTimeDelta / pC->ewc.scale_audio; - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intAudioMixingDoMixing(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioMixingTransition(M4VSS3GPP_InternalAudioMixingContext *pC) - * @brief Decode/encode a few AU backward to initiate the encoder for later Mix segment. - * @note - * @param pC (IN) VSS audio mixing internal context - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intAudioMixingTransition( - M4VSS3GPP_InternalAudioMixingContext *pC ) -{ - M4OSA_ERR err; - - M4ENCODER_AudioBuffer pEncInBuffer; /**< Encoder input buffer for api */ - M4ENCODER_AudioBuffer pEncOutBuffer; /**< Encoder output buffer for api */ - M4OSA_Time - frameTimeDelta = 0; /**< Duration of the encoded (then written) data */ - - M4OSA_Int32 iTargetCts, iCurrentCts; - - /** - * 'BZZZ' bug fix: - * add a silence frame */ - err = M4VSS3GPP_intAudioMixingWriteSilence(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingTransition():\ - M4VSS3GPP_intAudioMixingWriteSilence returns 0x%x", - err); - return err; - } - - iCurrentCts = (M4OSA_Int32)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5); - - /* Do not do pre-encode step if there is no mixing (remove, 100 %, or not editable) */ - if( M4OSA_FALSE == pC->bAudioMixingIsNeeded ) - { - /** - * Advance in the original audio stream to reach the current time - * (We don't want iAudioCTS to be modified by the jump function, - * so we have to use a local variable). */ - err = M4VSS3GPP_intClipJumpAudioAt(pC->pInputClipCtxt, &iCurrentCts); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1("M4VSS3GPP_intAudioMixingTransition:\ - M4VSS3GPP_intClipJumpAudioAt() returns 0x%x!", err); - return err; - } - } - else - { - /**< don't try to pre-decode if clip is at its beginning... */ - if( iCurrentCts > 0 ) - { - /** - * Get the output AU to write into */ - err = pC->ShellAPI.pWriterDataFcts->pStartAU( - pC->ewc.p3gpWriterContext, M4VSS3GPP_WRITER_AUDIO_STREAM_ID, - &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingTransition:\ - pWriterDataFcts->pStartAU(audio) returns 0x%x!", - err); - return err; - } - - /** - * Jump a few AUs backward */ - iTargetCts = iCurrentCts - M4VSS3GPP_NB_AU_PREFETCH - * pC->ewc.iSilenceFrameDuration; - - if( iTargetCts < 0 ) - { - iTargetCts = 0; /**< Sanity check */ - } - - err = M4VSS3GPP_intClipJumpAudioAt(pC->pInputClipCtxt, &iTargetCts); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingTransition: DECODE_ENCODE-prefetch:\ - M4VSS3GPP_intClipJumpAudioAt returns 0x%x!", - err); - return err; - } - - /** - * Decode/encode up to the wanted position */ - while( pC->pInputClipCtxt->iAudioFrameCts < iCurrentCts ) - { - err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pInputClipCtxt); - - M4OSA_TRACE2_3("M .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pInputClipCtxt->iAudioFrameCts - / pC->pInputClipCtxt->scale_audio, - pC->pInputClipCtxt->iAoffset - / pC->pInputClipCtxt->scale_audio, - pC->pInputClipCtxt->uiAudioFrameSize); - - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingTransition: DECODE_ENCODE-prefetch:\ - M4VSS3GPP_intClipReadNextAudioFrame(b) returns 0x%x!", - err); - return err; - } - - err = M4VSS3GPP_intClipDecodeCurrentAudioFrame( - pC->pInputClipCtxt); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingTransition: DECODE_ENCODE-prefetch:\ - M4VSS3GPP_intClipDecodeCurrentAudioFrame returns 0x%x!", - err); - return err; - } - - /* [Mono] or [Stereo interleaved] : all is in one buffer */ - pEncInBuffer.pTableBuffer[0] = - pC->pInputClipCtxt->AudioDecBufferOut.m_dataAddress; - pEncInBuffer.pTableBufferSize[0] = - pC->pInputClipCtxt->AudioDecBufferOut.m_bufferSize; - pEncInBuffer.pTableBuffer[1] = M4OSA_NULL; - pEncInBuffer.pTableBufferSize[1] = 0; - - /* Time in ms from data size, because it is PCM16 samples */ - frameTimeDelta = - pEncInBuffer.pTableBufferSize[0] / sizeof(short) - / pC->ewc.uiNbChannels; - - /** - * Prepare output buffer */ - pEncOutBuffer.pTableBuffer[0] = - (M4OSA_MemAddr8)pC->ewc.WriterAudioAU.dataAddress; - pEncOutBuffer.pTableBufferSize[0] = 0; - - M4OSA_TRACE2_0("N **** pre-encode"); - - /** - * Encode the PCM audio */ - err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctStep( - pC->ewc.pAudioEncCtxt, &pEncInBuffer, &pEncOutBuffer); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingTransition():\ - pAudioEncoderGlobalFcts->pFctStep returns 0x%x", - err); - return err; - } - } - - /** - * Set AU cts and size */ - pC->ewc.WriterAudioAU.size = pEncOutBuffer.pTableBufferSize[ - 0]; /**< Get the size of encoded data */ - pC->ewc.WriterAudioAU.CTS += frameTimeDelta; - - /** - * Write the AU */ - M4OSA_TRACE2_2("O ---- write : cts = %ld [ 0x%x ]", - (M4OSA_Int32)(pC->ewc.WriterAudioAU.CTS / pC->ewc.scale_audio), - pC->ewc.WriterAudioAU.size); - - err = pC->ShellAPI.pWriterDataFcts->pProcessAU( - pC->ewc.p3gpWriterContext, M4VSS3GPP_WRITER_AUDIO_STREAM_ID, - &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingTransition:\ - pWriterDataFcts->pProcessAU returns 0x%x!", err); - return err; - } - - /** - * Increment the audio CTS for the next step */ - pC->ewc.dATo += pC->ewc.iSilenceFrameDuration / pC->ewc.scale_audio; - } - } - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioMixingCreateVideoEncoder() - * @brief Creates the video encoder - * @note - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intAudioMixingCreateVideoEncoder( - M4VSS3GPP_InternalAudioMixingContext *pC ) -{ - M4OSA_ERR err; - M4ENCODER_AdvancedParams EncParams; - - /** - * Simulate a writer interface with our specific function */ - pC->ewc.OurWriterDataInterface.pProcessAU = - M4VSS3GPP_intProcessAU; /**< This function is VSS 3GPP specific, - but it follow the writer interface */ - pC->ewc.OurWriterDataInterface.pStartAU = - M4VSS3GPP_intStartAU; /**< This function is VSS 3GPP specific, - but it follow the writer interface */ - pC->ewc.OurWriterDataInterface.pWriterContext = - (M4WRITER_Context) - pC; /**< We give the internal context as writer context */ - - /** - * Get the encoder interface, if not already done */ - if( M4OSA_NULL == pC->ShellAPI.pVideoEncoderGlobalFcts ) - { - err = M4VSS3GPP_setCurrentVideoEncoder(&pC->ShellAPI, - pC->ewc.VideoStreamType); - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingCreateVideoEncoder: setCurrentEncoder returns 0x%x", - err); - M4ERR_CHECK_RETURN(err); - } - - /** - * Set encoder shell parameters according to VSS settings */ - - /* Common parameters */ - EncParams.InputFormat = M4ENCODER_kIYUV420; - EncParams.FrameWidth = pC->ewc.uiVideoWidth; - EncParams.FrameHeight = pC->ewc.uiVideoHeight; - EncParams.uiTimeScale = pC->ewc.uiVideoTimeScale; - EncParams.videoProfile = pC->ewc.outputVideoProfile; - EncParams.videoLevel = pC->ewc.outputVideoLevel; - - /* No strict regulation in video editor */ - /* Because of the effects and transitions we should allow more flexibility */ - /* Also it prevents to drop important frames - (with a bad result on sheduling and block effetcs) */ - EncParams.bInternalRegulation = M4OSA_FALSE; - EncParams.FrameRate = M4ENCODER_kVARIABLE_FPS; - - /** - * Other encoder settings (defaults) */ - EncParams.uiHorizontalSearchRange = 0; /* use default */ - EncParams.uiVerticalSearchRange = 0; /* use default */ - EncParams.bErrorResilience = M4OSA_FALSE; /* no error resilience */ - EncParams.uiIVopPeriod = 0; /* use default */ - EncParams.uiMotionEstimationTools = 0; /* M4V_MOTION_EST_TOOLS_ALL */ - EncParams.bAcPrediction = M4OSA_TRUE; /* use AC prediction */ - EncParams.uiStartingQuantizerValue = 10; /* initial QP = 10 */ - EncParams.bDataPartitioning = M4OSA_FALSE; /* no data partitioning */ - - switch( pC->ewc.VideoStreamType ) - { - case M4SYS_kH263: - - EncParams.Format = M4ENCODER_kH263; - - EncParams.uiStartingQuantizerValue = 10; - EncParams.uiRateFactor = 1; /* default */ - - EncParams.bErrorResilience = M4OSA_FALSE; - EncParams.bDataPartitioning = M4OSA_FALSE; - break; - - case M4SYS_kMPEG_4: - - EncParams.Format = M4ENCODER_kMPEG4; - - EncParams.uiStartingQuantizerValue = 8; - EncParams.uiRateFactor = 1; - - if( M4OSA_FALSE == pC->ewc.bVideoDataPartitioning ) - { - EncParams.bErrorResilience = M4OSA_FALSE; - EncParams.bDataPartitioning = M4OSA_FALSE; - } - else - { - EncParams.bErrorResilience = M4OSA_TRUE; - EncParams.bDataPartitioning = M4OSA_TRUE; - } - break; - - case M4SYS_kH264: - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingCreateVideoEncoder: M4SYS_H264"); - - EncParams.Format = M4ENCODER_kH264; - - EncParams.uiStartingQuantizerValue = 10; - EncParams.uiRateFactor = 1; /* default */ - - EncParams.bErrorResilience = M4OSA_FALSE; - EncParams.bDataPartitioning = M4OSA_FALSE; - break; - - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingCreateVideoEncoder: Unknown videoStreamType 0x%x", - pC->ewc.VideoStreamType); - return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT; - } - - EncParams.Bitrate = - pC->pInputClipCtxt->pSettings->ClipProperties.uiVideoBitrate; - - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingCreateVideoEncoder: calling encoder pFctInit"); - /** - * Init the video encoder (advanced settings version of the encoder Open function) */ - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctInit(&pC->ewc.pEncContext, - &pC->ewc.OurWriterDataInterface, M4VSS3GPP_intVPP, pC, - pC->ShellAPI.pCurrentVideoEncoderExternalAPI, - pC->ShellAPI.pCurrentVideoEncoderUserData); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingCreateVideoEncoder:\ - pVideoEncoderGlobalFcts->pFctInit returns 0x%x", - err); - return err; - } - - pC->ewc.encoderState = M4VSS3GPP_kEncoderClosed; - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingCreateVideoEncoder: calling encoder pFctOpen"); - M4OSA_TRACE1_2("vss: audio mix encoder open profile :%d, level %d", - EncParams.videoProfile, EncParams.videoLevel); - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctOpen(pC->ewc.pEncContext, - &pC->ewc.WriterVideoAU, &EncParams); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingCreateVideoEncoder:\ - pVideoEncoderGlobalFcts->pFctOpen returns 0x%x", - err); - return err; - } - - pC->ewc.encoderState = M4VSS3GPP_kEncoderStopped; - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingCreateVideoEncoder: calling encoder pFctStart"); - - if( M4OSA_NULL != pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStart ) - { - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStart( - pC->ewc.pEncContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingCreateVideoEncoder:\ - pVideoEncoderGlobalFcts->pFctStart returns 0x%x", - err); - return err; - } - } - - pC->ewc.encoderState = M4VSS3GPP_kEncoderRunning; - - /** - * Return */ - M4OSA_TRACE3_0( - "M4VSS3GPP_intAudioMixingCreateVideoEncoder: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioMixingDestroyVideoEncoder() - * @brief Destroy the video encoder - * @note - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intAudioMixingDestroyVideoEncoder( - M4VSS3GPP_InternalAudioMixingContext *pC ) -{ - M4OSA_ERR err = M4NO_ERROR; - - if( M4OSA_NULL != pC->ewc.pEncContext ) - { - if( M4VSS3GPP_kEncoderRunning == pC->ewc.encoderState ) - { - if( pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStop != M4OSA_NULL ) - { - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStop( - pC->ewc.pEncContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingDestroyVideoEncoder:\ - pVideoEncoderGlobalFcts->pFctStop returns 0x%x", - err); - } - } - - pC->ewc.encoderState = M4VSS3GPP_kEncoderStopped; - } - - /* Has the encoder actually been opened? Don't close it if that's not the case. */ - if( M4VSS3GPP_kEncoderStopped == pC->ewc.encoderState ) - { - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctClose( - pC->ewc.pEncContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingDestroyVideoEncoder:\ - pVideoEncoderGlobalFcts->pFctClose returns 0x%x", - err); - } - - pC->ewc.encoderState = M4VSS3GPP_kEncoderClosed; - } - - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctCleanup( - pC->ewc.pEncContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioMixingDestroyVideoEncoder:\ - pVideoEncoderGlobalFcts->pFctCleanup returns 0x%x!", - err); - /**< We do not return the error here because we still have stuff to free */ - } - - pC->ewc.encoderState = M4VSS3GPP_kNoEncoder; - /** - * Reset variable */ - pC->ewc.pEncContext = M4OSA_NULL; - } - - M4OSA_TRACE3_1( - "M4VSS3GPP_intAudioMixingDestroyVideoEncoder: returning 0x%x", err); - return err; -} - -M4OSA_Bool M4VSS3GPP_isThresholdBreached( M4OSA_Int32 *averageValue, - M4OSA_Int32 storeCount, M4OSA_Int32 thresholdValue ) -{ - M4OSA_Bool result = 0; - int i; - int finalValue = 0; - - for ( i = 0; i < storeCount; i++ ) - finalValue += averageValue[i]; - - finalValue = finalValue / storeCount; - - - if( finalValue > thresholdValue ) - result = M4OSA_TRUE; - else - result = M4OSA_FALSE; - - return result; -} diff --git a/libvideoeditor/vss/src/M4VSS3GPP_Clip.c b/libvideoeditor/vss/src/M4VSS3GPP_Clip.c deleted file mode 100755 index 40612f3..0000000 --- a/libvideoeditor/vss/src/M4VSS3GPP_Clip.c +++ /dev/null @@ -1,2112 +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 M4VSS3GPP_Clip.c - * @brief Implementation of functions related to input clip management. - * @note All functions in this file are static, i.e. non public - ****************************************************************************** - */ - -/****************/ -/*** Includes ***/ -/****************/ - -#include "NXPSW_CompilerSwitches.h" -/** - * Our headers */ -#include "M4VSS3GPP_API.h" -#include "M4VSS3GPP_ErrorCodes.h" -#include "M4VSS3GPP_InternalTypes.h" -#include "M4VSS3GPP_InternalFunctions.h" -#include "M4VSS3GPP_InternalConfig.h" - -/** - * OSAL headers */ -#include "M4OSA_Memory.h" /* OSAL memory management */ -#include "M4OSA_Debug.h" /* OSAL debug management */ - - -/** - * Common headers (for aac) */ -#include "M4_Common.h" - -#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS -#include "M4VD_EXTERNAL_Interface.h" - -#endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */ - -/* Osal header fileno */ -#include "M4OSA_CharStar.h" - -/** - ****************************************************************************** - * define Static function prototypes - ****************************************************************************** - */ - -static M4OSA_ERR M4VSS3GPP_intClipPrepareAudioDecoder( - M4VSS3GPP_ClipContext *pClipCtxt ); - -static M4OSA_ERR M4VSS3GPP_intCheckAndGetCodecAacProperties( - M4VSS3GPP_ClipContext *pClipCtxt); - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intClipOpen() - * @brief Open a clip. Creates a clip context. - * @note - * @param hClipCtxt (OUT) Return the internal clip context - * @param pClipSettings (IN) Edit settings of this clip. The module will keep a - * reference to this pointer - * @param pFileReadPtrFct (IN) Pointer to OSAL file reader functions - * @param bSkipAudioTrack (IN) If true, do not open the audio - * @param bFastOpenMode (IN) If true, use the fast mode of the 3gpp reader - * (only the first AU is read) - * @return M4NO_ERROR: No error - * @return M4ERR_ALLOC: There is no more available memory - ****************************************************************************** - */ - -M4OSA_ERR M4VSS3GPP_intClipInit( M4VSS3GPP_ClipContext ** hClipCtxt, - M4OSA_FileReadPointer *pFileReadPtrFct ) -{ - M4VSS3GPP_ClipContext *pClipCtxt; - M4OSA_ERR err; - - M4OSA_DEBUG_IF2((M4OSA_NULL == hClipCtxt), M4ERR_PARAMETER, - "M4VSS3GPP_intClipInit: hClipCtxt is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pFileReadPtrFct), M4ERR_PARAMETER, - "M4VSS3GPP_intClipInit: pFileReadPtrFct is M4OSA_NULL"); - - /** - * Allocate the clip context */ - *hClipCtxt = - (M4VSS3GPP_ClipContext *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_ClipContext), - M4VSS3GPP, (M4OSA_Char *)"M4VSS3GPP_ClipContext"); - - if( M4OSA_NULL == *hClipCtxt ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intClipInit(): unable to allocate M4VSS3GPP_ClipContext,\ - returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - M4OSA_TRACE3_1("M4VSS3GPP_intClipInit(): clipCtxt=0x%x", *hClipCtxt); - - - /** - * Use this shortcut to simplify the code */ - pClipCtxt = *hClipCtxt; - - /* Inialization of context Variables */ - memset((void *)pClipCtxt, 0,sizeof(M4VSS3GPP_ClipContext)); - - pClipCtxt->pSettings = M4OSA_NULL; - - /** - * Init the clip context */ - pClipCtxt->iVoffset = 0; - pClipCtxt->iAoffset = 0; - pClipCtxt->Vstatus = M4VSS3GPP_kClipStatus_READ; - pClipCtxt->Astatus = M4VSS3GPP_kClipStatus_READ; - - pClipCtxt->pReaderContext = M4OSA_NULL; - pClipCtxt->pVideoStream = M4OSA_NULL; - pClipCtxt->pAudioStream = M4OSA_NULL; - pClipCtxt->VideoAU.m_dataAddress = M4OSA_NULL; - pClipCtxt->AudioAU.m_dataAddress = M4OSA_NULL; - - pClipCtxt->pViDecCtxt = M4OSA_NULL; - pClipCtxt->iVideoDecCts = 0; - pClipCtxt->iVideoRenderCts = 0; - pClipCtxt->lastDecodedPlane = M4OSA_NULL; - pClipCtxt->iActualVideoBeginCut = 0; - pClipCtxt->iActualAudioBeginCut = 0; - pClipCtxt->bVideoAuAvailable = M4OSA_FALSE; - pClipCtxt->bFirstAuWritten = M4OSA_FALSE; - - pClipCtxt->bMpeg4GovState = M4OSA_FALSE; - - pClipCtxt->bAudioFrameAvailable = M4OSA_FALSE; - pClipCtxt->pAudioFramePtr = M4OSA_NULL; - pClipCtxt->iAudioFrameCts = 0; - pClipCtxt->pAudioDecCtxt = 0; - pClipCtxt->AudioDecBufferOut.m_bufferSize = 0; - pClipCtxt->AudioDecBufferOut.m_dataAddress = M4OSA_NULL; - - pClipCtxt->pFileReadPtrFct = pFileReadPtrFct; - pClipCtxt->pPlaneYuv = M4OSA_NULL; - pClipCtxt->pPlaneYuvWithEffect = M4OSA_NULL; - pClipCtxt->m_pPreResizeFrame = M4OSA_NULL; - pClipCtxt->bGetYuvDataFromDecoder = M4OSA_TRUE; - - /* - * Reset pointers for media and codecs interfaces */ - err = M4VSS3GPP_clearInterfaceTables(&pClipCtxt->ShellAPI); - M4ERR_CHECK_RETURN(err); - - /* - * Call the media and codecs subscription module */ - err = M4VSS3GPP_subscribeMediaAndCodec(&pClipCtxt->ShellAPI); - M4ERR_CHECK_RETURN(err); - - return M4NO_ERROR; -} - -// This method maps the frequency value to a string. -static const char* freqToString(int freq) { - switch (freq) { - case 8000: - return "_8000"; - case 11025: - return "_11025"; - case 12000: - return "_12000"; - case 16000: - return "_16000"; - case 22050: - return "_22050"; - case 24000: - return "_24000"; - case 32000: - return "_32000"; - case 44100: - return "_44100"; - case 48000: - return "_48000"; - default: - M4OSA_TRACE1_1("Unsupported sampling rate: %d Hz", freq); - return NULL; - } -} - -// This method maps the number of channel value to -// a string that will be part of a file name extension -static const char* channelToStringAndFileExt(int channels) { - switch (channels) { - case 1: - return "_1.pcm"; - case 2: - return "_2.pcm"; - default: - M4OSA_TRACE1_1("Unsupported %d channels", channels); - return NULL; - } -} - -/* Note: if the clip is opened in fast mode, it can only be used for analysis and nothing else. */ -M4OSA_ERR M4VSS3GPP_intClipOpen( M4VSS3GPP_ClipContext *pClipCtxt, - M4VSS3GPP_ClipSettings *pClipSettings, M4OSA_Bool bSkipAudioTrack, - M4OSA_Bool bFastOpenMode, M4OSA_Bool bAvoidOpeningVideoDec ) -{ - M4OSA_ERR err; - M4READER_MediaFamily mediaFamily; - M4_StreamHandler *pStreamHandler; - M4_StreamHandler dummyStreamHandler; - M4OSA_Int32 iDuration; - M4OSA_Void *decoderUserData; -#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS - - M4DECODER_MPEG4_DecoderConfigInfo dummy; - M4DECODER_VideoSize videoSizeFromDSI; -#endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */ - - M4DECODER_OutputFilter FilterOption; - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipCtxt), M4ERR_PARAMETER, - "M4VSS3GPP_intClipOpen: pClipCtxt is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettings), M4ERR_PARAMETER, - "M4VSS3GPP_intClipOpen: pClipSettings is M4OSA_NULL"); - - M4OSA_TRACE3_2( - "M4VSS3GPP_intClipOpen: called with pClipCtxt: 0x%x, bAvoidOpeningVideoDec=0x%x", - pClipCtxt, bAvoidOpeningVideoDec); - /** - * Keep a pointer to the clip settings. Remember that we don't possess it! */ - pClipCtxt->pSettings = pClipSettings; - if(M4VIDEOEDITING_kFileType_ARGB8888 == pClipCtxt->pSettings->FileType) { - M4OSA_TRACE3_0("M4VSS3GPP_intClipOpen: Image stream; set current vid dec"); - err = M4VSS3GPP_setCurrentVideoDecoder( - &pClipCtxt->ShellAPI, M4DA_StreamTypeVideoARGB8888); - M4ERR_CHECK_RETURN(err); - - decoderUserData = M4OSA_NULL; - - err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctCreate( - &pClipCtxt->pViDecCtxt, - &dummyStreamHandler, - pClipCtxt->ShellAPI.m_pReader, - pClipCtxt->ShellAPI.m_pReaderDataIt, - &pClipCtxt->VideoAU, - decoderUserData); - - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intClipOpen: \ - m_pVideoDecoder->m_pFctCreate returns 0x%x", err); - return err; - } - M4OSA_TRACE3_1("M4VSS3GPP_intClipOpen: \ - Vid dec started; pViDecCtxt=0x%x", pClipCtxt->pViDecCtxt); - - return M4NO_ERROR; - } - - /** - * Get the correct reader interface */ - err = M4VSS3GPP_setCurrentReader(&pClipCtxt->ShellAPI, - pClipCtxt->pSettings->FileType); - M4ERR_CHECK_RETURN(err); - - /** - * Init the 3GPP or MP3 reader */ - err = - pClipCtxt->ShellAPI.m_pReader->m_pFctCreate(&pClipCtxt->pReaderContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctCreate returns 0x%x", - err); - return err; - } - - /** - * Link the reader interface to the reader context (used by the decoder to know the reader) */ - pClipCtxt->ShellAPI.m_pReaderDataIt->m_readerContext = - pClipCtxt->pReaderContext; - - /** - * Set the OSAL read function set */ - err = pClipCtxt->ShellAPI.m_pReader->m_pFctSetOption( - pClipCtxt->pReaderContext, - M4READER_kOptionID_SetOsaFileReaderFctsPtr, - (M4OSA_DataOption)(pClipCtxt->pFileReadPtrFct)); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctSetOption returns 0x%x", - err); - return err; - } - - /** - * Set the fast open mode if asked (3GPP only) */ - if( M4VIDEOEDITING_kFileType_3GPP == pClipCtxt->pSettings->FileType ) - { - if( M4OSA_TRUE == bFastOpenMode ) - { - err = pClipCtxt->ShellAPI.m_pReader->m_pFctSetOption( - pClipCtxt->pReaderContext, - M4READER_3GP_kOptionID_FastOpenMode, M4OSA_NULL); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipOpen():\ - m_pReader->m_pFctSetOption(FastOpenMode) returns 0x%x", - err); - return err; - } - } - - /** - * Set the skip audio option if asked */ - if( M4OSA_TRUE == bSkipAudioTrack ) - { - err = pClipCtxt->ShellAPI.m_pReader->m_pFctSetOption( - pClipCtxt->pReaderContext, - M4READER_3GP_kOptionID_VideoOnly, M4OSA_NULL); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctSetOption(VideoOnly) returns 0x%x", - err); - return err; - } - } - } - if (pClipCtxt->pSettings->FileType == M4VIDEOEDITING_kFileType_PCM) { - // Compose the temp filename with sample rate and channel information. - const char* freqStr = freqToString( - pClipCtxt->pSettings->ClipProperties.uiSamplingFrequency); - - if (freqStr == NULL) { - return M4VSS3GPP_WAR_INCOMPATIBLE_AUDIO_SAMPLING_FREQUENCY; - } - - const char* chanStr = channelToStringAndFileExt( - pClipCtxt->pSettings->ClipProperties.uiNbChannels); - - if (chanStr == NULL) { - return M4VSS3GPP_WAR_INCOMPATIBLE_AUDIO_NB_OF_CHANNELS; - } - - // Allocate one byte more to hold the null terminator - M4OSA_UInt32 length = - strlen(pClipSettings->pFile) + strlen(freqStr) + strlen(chanStr) + 1; - - char* pTempFile = (char *) malloc(length); - if (pTempFile == NULL) { - M4OSA_TRACE1_1("M4VSS3GPP_intClipOpen(): malloc %d bytes fail",length); - return M4ERR_ALLOC; - } - memset(pTempFile, 0, length); - memcpy(pTempFile, pClipSettings->pFile, strlen(pClipSettings->pFile)); - strncat(pTempFile, freqStr, strlen(freqStr)); - strncat(pTempFile, chanStr, strlen(chanStr)); - - err = pClipCtxt->ShellAPI.m_pReader->m_pFctOpen( pClipCtxt->pReaderContext, pTempFile); - if (pTempFile != NULL) { - free(pTempFile); - pTempFile = NULL; - } - if ( M4NO_ERROR != err ) { - M4OSA_TRACE1_1("M4VSS3GPP_intClipOpen(): open pcm file returns error : 0x%x", err); - return err; - } - } - else - { - /** - * Open the 3GPP/MP3 clip file */ - err = pClipCtxt->ShellAPI.m_pReader->m_pFctOpen( pClipCtxt->pReaderContext, - pClipSettings->pFile); - } - if( M4NO_ERROR != err ) - { - M4OSA_UInt32 uiDummy, uiCoreId; - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctOpen returns 0x%x", err); - - /** - * If the error is from the core reader, we change it to a public VSS3GPP error */ - M4OSA_ERR_SPLIT(err, uiDummy, uiCoreId, uiDummy); - - if( M4MP4_READER == uiCoreId ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intClipOpen(): returning M4VSS3GPP_ERR_INVALID_3GPP_FILE"); - return M4VSS3GPP_ERR_INVALID_3GPP_FILE; - } - return err; - } - - /** - * Get the audio and video streams */ - while( err == M4NO_ERROR ) - { - err = pClipCtxt->ShellAPI.m_pReader->m_pFctGetNextStream( - pClipCtxt->pReaderContext, &mediaFamily, &pStreamHandler); - - /*in case we found a BIFS stream or something else...*/ - if( ( err == ((M4OSA_UInt32)M4ERR_READER_UNKNOWN_STREAM_TYPE)) - || (err == ((M4OSA_UInt32)M4WAR_TOO_MUCH_STREAMS)) ) - { - err = M4NO_ERROR; - continue; - } - - if( M4NO_ERROR == err ) /**< One stream found */ - { - /** - * Found a video stream */ - if( ( mediaFamily == M4READER_kMediaFamilyVideo) - && (M4OSA_NULL == pClipCtxt->pVideoStream) ) - { - if( ( M4DA_StreamTypeVideoH263 == pStreamHandler->m_streamType) - || (M4DA_StreamTypeVideoMpeg4 - == pStreamHandler->m_streamType) - || (M4DA_StreamTypeVideoMpeg4Avc - == pStreamHandler->m_streamType) ) - { - M4OSA_TRACE3_1( - "M4VSS3GPP_intClipOpen():\ - Found a H263 or MPEG-4 or H264 video stream in input 3gpp clip; %d", - pStreamHandler->m_streamType); - - /** - * Keep pointer to the video stream */ - pClipCtxt->pVideoStream = - (M4_VideoStreamHandler *)pStreamHandler; - pStreamHandler->m_bStreamIsOK = M4OSA_TRUE; - - /** - * Reset the stream reader */ - err = pClipCtxt->ShellAPI.m_pReader->m_pFctReset( - pClipCtxt->pReaderContext, - (M4_StreamHandler *)pClipCtxt->pVideoStream); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctReset(video) returns 0x%x", - err); - return err; - } - - /** - * Initializes an access Unit */ - err = pClipCtxt->ShellAPI.m_pReader->m_pFctFillAuStruct( - pClipCtxt->pReaderContext, - (M4_StreamHandler *)pClipCtxt->pVideoStream, - &pClipCtxt->VideoAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipOpen():\ - m_pReader->m_pFctFillAuStruct(video) returns 0x%x", - err); - return err; - } - } - else /**< Not H263 or MPEG-4 (H264, etc.) */ - { - M4OSA_TRACE1_1( - "M4VSS_editClipOpen():\ - Found an unsupported video stream (0x%x) in input 3gpp clip", - pStreamHandler->m_streamType); - - pStreamHandler->m_bStreamIsOK = M4OSA_FALSE; - } - } - /** - * Found an audio stream */ - else if( ( mediaFamily == M4READER_kMediaFamilyAudio) - && (M4OSA_NULL == pClipCtxt->pAudioStream) ) - { - if( ( M4DA_StreamTypeAudioAmrNarrowBand - == pStreamHandler->m_streamType) - || (M4DA_StreamTypeAudioAac == pStreamHandler->m_streamType) - || (M4DA_StreamTypeAudioMp3 - == pStreamHandler->m_streamType) - || (M4DA_StreamTypeAudioEvrc - == pStreamHandler->m_streamType) - || (M4DA_StreamTypeAudioPcm - == pStreamHandler->m_streamType) ) - { - M4OSA_TRACE3_1( - "M4VSS3GPP_intClipOpen(): \ - Found an AMR-NB or AAC or MP3 audio stream in input clip; %d", - pStreamHandler->m_streamType); - - /** - * Keep pointer to the audio stream */ - pClipCtxt->pAudioStream = - (M4_AudioStreamHandler *)pStreamHandler; - pStreamHandler->m_bStreamIsOK = M4OSA_TRUE; - - /** - * Reset the stream reader */ - err = pClipCtxt->ShellAPI.m_pReader->m_pFctReset( - pClipCtxt->pReaderContext, - (M4_StreamHandler *)pClipCtxt->pAudioStream); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctReset(audio) returns 0x%x", - err); - return err; - } - - /** - * Initializes an access Unit */ - err = pClipCtxt->ShellAPI.m_pReader->m_pFctFillAuStruct( - pClipCtxt->pReaderContext, - (M4_StreamHandler *)pClipCtxt->pAudioStream, - &pClipCtxt->AudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipOpen():\ - m_pReader->m_pFctFillAuStruct(audio) returns 0x%x", - err); - return err; - } - } - else /**< Not AMR-NB or AAC (AMR-WB...) */ - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipOpen():\ - Found an unsupported audio stream (0x%x) in input 3gpp/mp3 clip", - pStreamHandler->m_streamType); - - pStreamHandler->m_bStreamIsOK = M4OSA_FALSE; - } - } - } - else if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipOpen(): m_pReader->m_pFctGetNextStream() returns 0x%x!", - err); - return err; - } - } - - /** - * Init Video decoder */ - if( M4OSA_NULL != pClipCtxt->pVideoStream ) - { -#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS - /* If external decoders are possible, it's best to avoid opening the decoder if the clip is only - going to be used for analysis, as we're not going to use it for the analysis in the case of a - possible external decoder anyway, and either there could be no decoder at this point or the HW - decoder could be present, which we want to avoid opening for that. See comments in - intBuildAnalysis for more details. */ - - /* CHANGEME Temporarily only do this for MPEG4, since for now only MPEG4 external decoders are - supported, and the following wouldn't work for H263 so a release where external decoders are - possible, but not used, wouldn't work with H263 stuff. */ - - if( bAvoidOpeningVideoDec && M4DA_StreamTypeVideoMpeg4 - == pClipCtxt->pVideoStream->m_basicProperties.m_streamType ) - { - /* Oops! The mere act of opening the decoder also results in the image size being - filled in the video stream! Compensate for this by using ParseVideoDSI to fill - this info. */ - M4OSA_TRACE3_0( - "M4VSS3GPP_intClipOpen: Mpeg4 stream; vid dec not started"); - err = M4DECODER_EXTERNAL_ParseVideoDSI(pClipCtxt->pVideoStream-> - m_basicProperties.m_pDecoderSpecificInfo, - pClipCtxt->pVideoStream-> - m_basicProperties.m_decoderSpecificInfoSize, - &dummy, &videoSizeFromDSI); - - pClipCtxt->pVideoStream->m_videoWidth = videoSizeFromDSI.m_uiWidth; - pClipCtxt->pVideoStream->m_videoHeight = - videoSizeFromDSI.m_uiHeight; - } - else - { - -#endif - - M4OSA_TRACE3_0( - "M4VSS3GPP_intClipOpen: Mp4/H263/H264 stream; set current vid dec"); - err = M4VSS3GPP_setCurrentVideoDecoder(&pClipCtxt->ShellAPI, - pClipCtxt->pVideoStream->m_basicProperties.m_streamType); - M4ERR_CHECK_RETURN(err); - -#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS - - decoderUserData = - pClipCtxt->ShellAPI.m_pCurrentVideoDecoderUserData; - -#else - - decoderUserData = M4OSA_NULL; - -#endif - - err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctCreate( - &pClipCtxt->pViDecCtxt, - &pClipCtxt->pVideoStream->m_basicProperties, - pClipCtxt->ShellAPI.m_pReader, - pClipCtxt->ShellAPI.m_pReaderDataIt, - &pClipCtxt->VideoAU, decoderUserData); - - if( ( ((M4OSA_UInt32)M4ERR_DECODER_H263_PROFILE_NOT_SUPPORTED) == err) - || (((M4OSA_UInt32)M4ERR_DECODER_H263_NOT_BASELINE) == err) ) - { - /** - * Our decoder is not compatible with H263 profile other than 0. - * So it returns this internal error code. - * We translate it to our own error code */ - return M4VSS3GPP_ERR_H263_PROFILE_NOT_SUPPORTED; - } - else if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipOpen: m_pVideoDecoder->m_pFctCreate returns 0x%x", - err); - return err; - } - M4OSA_TRACE3_1( - "M4VSS3GPP_intClipOpen: Vid dec started; pViDecCtxt=0x%x", - pClipCtxt->pViDecCtxt); - - if( M4DA_StreamTypeVideoMpeg4Avc - == pClipCtxt->pVideoStream->m_basicProperties.m_streamType ) - { - FilterOption.m_pFilterFunction = - (M4OSA_Void *) &M4VIFI_ResizeBilinearYUV420toYUV420; - FilterOption.m_pFilterUserData = M4OSA_NULL; - err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption( - pClipCtxt->pViDecCtxt, M4DECODER_kOptionID_OutputFilter, - (M4OSA_DataOption) &FilterOption); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipOpen: m_pVideoDecoder->m_pFctSetOption returns 0x%x", - err); - return err; - } - else - { - M4OSA_TRACE3_0( - "M4VSS3GPP_intClipOpen: m_pVideoDecoder->m_pFctSetOption\ - M4DECODER_kOptionID_OutputFilter OK"); - } - } -#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS - - } - -#endif - - } - - /** - * Init Audio decoder */ - if( M4OSA_NULL != pClipCtxt->pAudioStream ) - { - err = M4VSS3GPP_intClipPrepareAudioDecoder(pClipCtxt); - M4ERR_CHECK_RETURN(err); - M4OSA_TRACE3_1("M4VSS3GPP_intClipOpen: Audio dec started; context=0x%x", - pClipCtxt->pAudioDecCtxt); - } - else - { - pClipCtxt->AudioAU.m_streamID = 0; - pClipCtxt->AudioAU.m_dataAddress = M4OSA_NULL; - pClipCtxt->AudioAU.m_size = 0; - pClipCtxt->AudioAU.m_CTS = 0; - pClipCtxt->AudioAU.m_DTS = 0; - pClipCtxt->AudioAU.m_attribute = 0; - pClipCtxt->AudioAU.m_maxsize = 0; - pClipCtxt->AudioAU.m_structSize = sizeof(pClipCtxt->AudioAU); - } - - /** - * Get the duration of the longest stream */ - if( M4OSA_TRUE == pClipCtxt->pSettings->ClipProperties.bAnalysed ) - { - /* If already calculated set it to previous value */ - /* Because fast open and full open can return a different value, - it can mismatch user settings */ - /* Video track is more important than audio track (if video track is shorter than - audio track, it can led to cut larger than expected) */ - iDuration = pClipCtxt->pSettings->ClipProperties.uiClipVideoDuration; - - if( iDuration == 0 ) - { - iDuration = pClipCtxt->pSettings->ClipProperties.uiClipDuration; - } - } - else - { - /* Else compute it from streams */ - iDuration = 0; - - if( M4OSA_NULL != pClipCtxt->pVideoStream ) - { - iDuration = (M4OSA_Int32)( - pClipCtxt->pVideoStream->m_basicProperties.m_duration); - } - - if( ( M4OSA_NULL != pClipCtxt->pAudioStream) && ((M4OSA_Int32)( - pClipCtxt->pAudioStream->m_basicProperties.m_duration) - > iDuration) && iDuration == 0 ) - { - iDuration = (M4OSA_Int32)( - pClipCtxt->pAudioStream->m_basicProperties.m_duration); - } - } - - /** - * If end time is not used, we set it to the video track duration */ - if( 0 == pClipCtxt->pSettings->uiEndCutTime ) - { - pClipCtxt->pSettings->uiEndCutTime = (M4OSA_UInt32)iDuration; - } - - pClipCtxt->iEndTime = (M4OSA_Int32)pClipCtxt->pSettings->uiEndCutTime; - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intClipOpen(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_Void M4VSS3GPP_intClipDeleteAudioTrack() - * @brief Delete the audio track. Clip will be like if it had no audio track - * @note - * @param pClipCtxt (IN) Internal clip context - ****************************************************************************** - */ -M4OSA_Void M4VSS3GPP_intClipDeleteAudioTrack( M4VSS3GPP_ClipContext *pClipCtxt ) -{ - /** - * But we don't have to free the audio stream. It will be freed by the reader when closing it*/ - pClipCtxt->pAudioStream = M4OSA_NULL; - - /** - * We will return a constant silence AMR AU. - * We set it here once, instead of at each read audio step. */ - pClipCtxt->pAudioFramePtr = (M4OSA_MemAddr8)pClipCtxt->pSilenceFrameData; - pClipCtxt->uiAudioFrameSize = pClipCtxt->uiSilenceFrameSize; - - /** - * Free the decoded audio buffer (it needs to be re-allocated to store silence - frame eventually)*/ - if( M4OSA_NULL != pClipCtxt->AudioDecBufferOut.m_dataAddress ) - { - free(pClipCtxt->AudioDecBufferOut.m_dataAddress); - pClipCtxt->AudioDecBufferOut.m_dataAddress = M4OSA_NULL; - } - - return; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intClipDecodeVideoUpToCurrentTime() - * @brief Jump to the previous RAP and decode up to the current video time - * @param pClipCtxt (IN) Internal clip context - * @param iCts (IN) Target CTS - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intClipDecodeVideoUpToCts( M4VSS3GPP_ClipContext *pClipCtxt, - M4OSA_Int32 iCts ) -{ - M4OSA_Int32 iRapCts, iClipCts; - M4_MediaTime dDecodeTime; - M4OSA_Bool bClipJump = M4OSA_FALSE; - M4OSA_ERR err; - - /** - * Compute the time in the clip base */ - iClipCts = iCts - pClipCtxt->iVoffset; - - /** - * If we were reading the clip, we must jump to the previous RAP - * to decode from that point. */ - if( M4VSS3GPP_kClipStatus_READ == pClipCtxt->Vstatus ) - { - /** - * The decoder must be told to jump */ - bClipJump = M4OSA_TRUE; - pClipCtxt->iVideoDecCts = iClipCts; - - /** - * Remember the clip reading state */ - pClipCtxt->Vstatus = M4VSS3GPP_kClipStatus_DECODE_UP_TO; - } - - /** - * If we are in decodeUpTo() process, check if we need to do - one more step or if decoding is finished */ - if( M4VSS3GPP_kClipStatus_DECODE_UP_TO == pClipCtxt->Vstatus ) - { - /* Do a step of 500 ms decoding */ - pClipCtxt->iVideoDecCts += 500; - - if( pClipCtxt->iVideoDecCts > iClipCts ) - { - /* Target time reached, we switch back to DECODE mode */ - pClipCtxt->iVideoDecCts = iClipCts; - pClipCtxt->Vstatus = M4VSS3GPP_kClipStatus_DECODE; - } - - M4OSA_TRACE2_1("c ,,,, decode up to : %ld", pClipCtxt->iVideoDecCts); - } - else - { - /* Just decode at current clip cts */ - pClipCtxt->iVideoDecCts = iClipCts; - - M4OSA_TRACE2_1("d ,,,, decode up to : %ld", pClipCtxt->iVideoDecCts); - } - - /** - * Decode up to the target */ - M4OSA_TRACE3_2( - "M4VSS3GPP_intClipDecodeVideoUpToCts: Decoding upTo CTS %.3f, pClipCtxt=0x%x", - dDecodeTime, pClipCtxt); - - dDecodeTime = (M4OSA_Double)pClipCtxt->iVideoDecCts; - pClipCtxt->isRenderDup = M4OSA_FALSE; - err = - pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctDecode(pClipCtxt->pViDecCtxt, - &dDecodeTime, bClipJump, 0); - - if( ( M4NO_ERROR != err) && (M4WAR_NO_MORE_AU != err) - && (err != M4WAR_VIDEORENDERER_NO_NEW_FRAME) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipDecodeVideoUpToCts: m_pFctDecode returns 0x%x!", - err); - return err; - } - - if( err == M4WAR_VIDEORENDERER_NO_NEW_FRAME ) - { - pClipCtxt->isRenderDup = M4OSA_TRUE; - } - - /** - * Return */ - M4OSA_TRACE3_0("M4VSS3GPP_intClipDecodeVideoUpToCts: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intClipReadNextAudioFrame() - * @brief Read one AU frame in the clip - * @note - * @param pClipCtxt (IN) Internal clip context - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intClipReadNextAudioFrame( - M4VSS3GPP_ClipContext *pClipCtxt ) -{ - M4OSA_ERR err; - - /* ------------------------------ */ - /* ---------- NO AUDIO ---------- */ - /* ------------------------------ */ - - if( M4OSA_NULL == pClipCtxt->pAudioStream ) - { - /* If there is no audio track, we return silence AUs */ - pClipCtxt->pAudioFramePtr = - (M4OSA_MemAddr8)pClipCtxt->pSilenceFrameData; - pClipCtxt->uiAudioFrameSize = pClipCtxt->uiSilenceFrameSize; - pClipCtxt->iAudioFrameCts += pClipCtxt->iSilenceFrameDuration; - - M4OSA_TRACE2_0("b #### blank track"); - } - - /* ---------------------------------- */ - /* ---------- AMR-NB, EVRC ---------- */ - /* ---------------------------------- */ - - else if( ( M4VIDEOEDITING_kAMR_NB - == pClipCtxt->pSettings->ClipProperties.AudioStreamType) - || (M4VIDEOEDITING_kEVRC - == pClipCtxt->pSettings->ClipProperties.AudioStreamType) ) - { - if( M4OSA_FALSE == pClipCtxt->bAudioFrameAvailable ) - { - /** - * No AU available, so we must must read one from the original track reader */ - err = pClipCtxt->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( - pClipCtxt->pReaderContext, - (M4_StreamHandler *)pClipCtxt->pAudioStream, - &pClipCtxt->AudioAU); - - if( M4NO_ERROR == err ) - { - /** - * Set the current AMR frame position at the beginning of the read AU */ - pClipCtxt->pAudioFramePtr = pClipCtxt->AudioAU.m_dataAddress; - - /** - * Set the AMR frame CTS */ - pClipCtxt->iAudioFrameCts = - (M4OSA_Int32)(pClipCtxt->AudioAU.m_CTS - * pClipCtxt->scale_audio + 0.5); - } - else if( ( M4WAR_NO_MORE_AU == err) && (M4VIDEOEDITING_kAMR_NB - == pClipCtxt->pSettings->ClipProperties.AudioStreamType) ) - { - /** - * If there is less audio than the stream duration indicated, - * we return silence at the end of the stream. */ - pClipCtxt->pAudioFramePtr = - (M4OSA_MemAddr8)pClipCtxt->pSilenceFrameData; - pClipCtxt->uiAudioFrameSize = pClipCtxt->uiSilenceFrameSize; - pClipCtxt->iAudioFrameCts += pClipCtxt->iSilenceFrameDuration; - - M4OSA_TRACE2_0("a #### silence AU"); - - /** - * Return with M4WAR_NO_MORE_AU */ - M4OSA_TRACE3_0( - "M4VSS3GPP_intClipReadNextAudioFrame()-AMR: \ - returning M4WAR_NO_MORE_AU (silence)"); - return M4WAR_NO_MORE_AU; - } - else /**< fatal error (or no silence in EVRC) */ - { - M4OSA_TRACE3_1( - "M4VSS3GPP_intClipReadNextAudioFrame()-AMR: m_pFctGetNextAu() returns 0x%x", - err); - return err; - } - } - else /* bAudioFrameAvailable */ - { - /** - * Go to the next AMR frame in the AU */ - pClipCtxt->pAudioFramePtr += pClipCtxt->uiAudioFrameSize; - - /** - * Increment CTS: one AMR frame is 20 ms long */ - pClipCtxt->iAudioFrameCts += pClipCtxt->iSilenceFrameDuration; - } - - /** - * Get the size of the pointed AMR frame */ - switch( pClipCtxt->pSettings->ClipProperties.AudioStreamType ) - { - case M4VIDEOEDITING_kAMR_NB: - pClipCtxt->uiAudioFrameSize = - (M4OSA_UInt16)M4VSS3GPP_intGetFrameSize_AMRNB( - pClipCtxt->pAudioFramePtr); - break; - - case M4VIDEOEDITING_kEVRC: - pClipCtxt->uiAudioFrameSize = - (M4OSA_UInt16)M4VSS3GPP_intGetFrameSize_EVRC( - pClipCtxt->pAudioFramePtr); - break; - default: - break; - } - - if( 0 == pClipCtxt->uiAudioFrameSize ) - { - M4OSA_TRACE3_0( - "M4VSS3GPP_intClipReadNextAudioFrame()-AMR: AU frame size == 0,\ - returning M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AMR_AU"); - return M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AU; - } - else if( pClipCtxt->uiAudioFrameSize > pClipCtxt->AudioAU.m_size ) - { - M4OSA_TRACE3_0( - "M4VSS3GPP_intClipReadNextAudioFrame()-AMR: AU frame size greater than AU size!,\ - returning M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AMR_AU"); - return M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AU; - } - - /** - * Check if the end of the current AU has been reached or not */ - if( ( pClipCtxt->pAudioFramePtr + pClipCtxt->uiAudioFrameSize) - < (pClipCtxt->AudioAU.m_dataAddress + pClipCtxt->AudioAU.m_size) ) - { - pClipCtxt->bAudioFrameAvailable = M4OSA_TRUE; - } - else - { - pClipCtxt->bAudioFrameAvailable = - M4OSA_FALSE; /**< will be used for next call */ - } - } - - /* ------------------------- */ - /* ---------- AAC ---------- */ - /* ------------------------- */ - - else if( ( M4VIDEOEDITING_kAAC - == pClipCtxt->pSettings->ClipProperties.AudioStreamType) - || (M4VIDEOEDITING_kAACplus - == pClipCtxt->pSettings->ClipProperties.AudioStreamType) - || (M4VIDEOEDITING_keAACplus - == pClipCtxt->pSettings->ClipProperties.AudioStreamType) ) - { - err = pClipCtxt->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( - pClipCtxt->pReaderContext, - (M4_StreamHandler *)pClipCtxt->pAudioStream, - &pClipCtxt->AudioAU); - - if( M4NO_ERROR == err ) - { - pClipCtxt->pAudioFramePtr = pClipCtxt->AudioAU.m_dataAddress; - pClipCtxt->uiAudioFrameSize = - (M4OSA_UInt16)pClipCtxt->AudioAU.m_size; - pClipCtxt->iAudioFrameCts = - (M4OSA_Int32)(pClipCtxt->AudioAU.m_CTS * pClipCtxt->scale_audio - + 0.5); - - /* Patch because m_CTS is unfortunately rounded in 3gp reader shell */ - /* (cts is not an integer with frequency 24 kHz for example) */ - pClipCtxt->iAudioFrameCts = ( ( pClipCtxt->iAudioFrameCts - + pClipCtxt->iSilenceFrameDuration / 2) - / pClipCtxt->iSilenceFrameDuration) - * pClipCtxt->iSilenceFrameDuration; - } - else if( M4WAR_NO_MORE_AU == err ) - { - /** - * If there is less audio than the stream duration indicated, - * we return silence at the end of the stream. */ - pClipCtxt->pAudioFramePtr = - (M4OSA_MemAddr8)pClipCtxt->pSilenceFrameData; - pClipCtxt->uiAudioFrameSize = pClipCtxt->uiSilenceFrameSize; - pClipCtxt->iAudioFrameCts += pClipCtxt->iSilenceFrameDuration; - - M4OSA_TRACE2_0("a #### silence AU"); - - /** - * Return with M4WAR_NO_MORE_AU */ - M4OSA_TRACE3_0( - "M4VSS3GPP_intClipReadNextAudioFrame()-AAC:\ - returning M4WAR_NO_MORE_AU (silence)"); - return M4WAR_NO_MORE_AU; - } - else /**< fatal error */ - { - M4OSA_TRACE3_1( - "M4VSS3GPP_intClipReadNextAudioFrame()-AAC: m_pFctGetNextAu() returns 0x%x", - err); - return err; - } - } - - /* --------------------------------- */ - /* ---------- MP3, others ---------- */ - /* --------------------------------- */ - - else - { - err = pClipCtxt->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( - pClipCtxt->pReaderContext, - (M4_StreamHandler *)pClipCtxt->pAudioStream, - &pClipCtxt->AudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE3_1( - "M4VSS3GPP_intClipReadNextAudioFrame()-MP3: m_pFctGetNextAu() returns 0x%x", - err); - return err; - } - - pClipCtxt->pAudioFramePtr = pClipCtxt->AudioAU.m_dataAddress; - pClipCtxt->uiAudioFrameSize = (M4OSA_UInt16)pClipCtxt->AudioAU.m_size; - pClipCtxt->iAudioFrameCts = - (M4OSA_Int32)(pClipCtxt->AudioAU.m_CTS * pClipCtxt->scale_audio - + 0.5); - } - - /** - * Return with no error */ - M4OSA_TRACE3_0( - "M4VSS3GPP_intClipReadNextAudioFrame(): returning M4NO_ERROR"); - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intClipPrepareAudioDecoder() - * @brief Creates and initialize the audio decoder for the clip. - * @note - * @param pClipCtxt (IN) internal clip context - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intClipPrepareAudioDecoder( - M4VSS3GPP_ClipContext *pClipCtxt ) -{ - M4OSA_ERR err = M4NO_ERROR; - M4_StreamType audiotype; -#ifdef M4VSS_SUPPORT_OMX_CODECS - - M4_AACType iAacType = 0; - -#endif - - /** - * Set the proper audio decoder */ - - audiotype = pClipCtxt->pAudioStream->m_basicProperties.m_streamType; - - //EVRC - if( M4DA_StreamTypeAudioEvrc - != audiotype ) /* decoder not supported yet, but allow to do null encoding */ - - err = M4VSS3GPP_setCurrentAudioDecoder(&pClipCtxt->ShellAPI, audiotype); - M4ERR_CHECK_RETURN(err); - - /** - * Creates the audio decoder */ - if( M4OSA_NULL == pClipCtxt->ShellAPI.m_pAudioDecoder ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intClipPrepareAudioDecoder(): Fails to initiate the audio decoder."); - return M4VSS3GPP_ERR_AUDIO_DECODER_INIT_FAILED; - } - - if( M4OSA_NULL == pClipCtxt->pAudioDecCtxt ) - { -#ifdef M4VSS_SUPPORT_OMX_CODECS - - if( M4OSA_TRUE == pClipCtxt->ShellAPI.bAllowFreeingOMXCodecInterface ) - { - if( M4DA_StreamTypeAudioAac == audiotype ) { - err = M4VSS3GPP_intCheckAndGetCodecAacProperties( - pClipCtxt); - } else if (M4DA_StreamTypeAudioPcm != audiotype) { - err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctCreateAudioDec( - &pClipCtxt->pAudioDecCtxt, pClipCtxt->pAudioStream, - M4OSA_NULL); - } else { - err = M4NO_ERROR; - } - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipPrepareAudioDecoder: m_pAudioDecoder->m_pFctCreateAudioDec\ - returns 0x%x", err); - return err; - } - } - else - { - M4OSA_TRACE3_1( - "M4VSS3GPP_intClipPrepareAudioDecoder:\ - Creating external audio decoder of type 0x%x", audiotype); - /* External OMX codecs are used*/ - if( M4DA_StreamTypeAudioAac == audiotype ) - { - err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctCreateAudioDec( - &pClipCtxt->pAudioDecCtxt, pClipCtxt->pAudioStream, - pClipCtxt->ShellAPI.pCurrentAudioDecoderUserData); - - if( M4NO_ERROR == err ) - { - /* AAC properties*/ - /*get from Reader; temporary, till Audio decoder shell API - available to get the AAC properties*/ - pClipCtxt->AacProperties.aNumChan = - pClipCtxt->pAudioStream->m_nbChannels; - pClipCtxt->AacProperties.aSampFreq = - pClipCtxt->pAudioStream->m_samplingFrequency; - - err = pClipCtxt->ShellAPI.m_pAudioDecoder-> - m_pFctGetOptionAudioDec(pClipCtxt->pAudioDecCtxt, - M4AD_kOptionID_StreamType, - (M4OSA_DataOption) &iAacType); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipPrepareAudioDecoder:\ - m_pAudioDecoder->m_pFctGetOptionAudioDec returns err 0x%x", err); - iAacType = M4_kAAC; //set to default - err = M4NO_ERROR; - } - else { - M4OSA_TRACE3_1( - "M4VSS3GPP_intClipPrepareAudioDecoder: \ - m_pAudioDecoder->m_pFctGetOptionAudioDec returns streamType %d", - iAacType); - } - switch( iAacType ) - { - case M4_kAAC: - pClipCtxt->AacProperties.aSBRPresent = 0; - pClipCtxt->AacProperties.aPSPresent = 0; - break; - - case M4_kAACplus: - pClipCtxt->AacProperties.aSBRPresent = 1; - pClipCtxt->AacProperties.aPSPresent = 0; - pClipCtxt->AacProperties.aExtensionSampFreq = - pClipCtxt->pAudioStream->m_samplingFrequency; - break; - - case M4_keAACplus: - pClipCtxt->AacProperties.aSBRPresent = 1; - pClipCtxt->AacProperties.aPSPresent = 1; - pClipCtxt->AacProperties.aExtensionSampFreq = - pClipCtxt->pAudioStream->m_samplingFrequency; - break; - default: - break; - } - M4OSA_TRACE3_2( - "M4VSS3GPP_intClipPrepareAudioDecoder: AAC NBChans=%d, SamplFreq=%d", - pClipCtxt->AacProperties.aNumChan, - pClipCtxt->AacProperties.aSampFreq); - } - } - else - err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctCreateAudioDec( - &pClipCtxt->pAudioDecCtxt, pClipCtxt->pAudioStream, - pClipCtxt->ShellAPI.pCurrentAudioDecoderUserData); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipPrepareAudioDecoder:\ - m_pAudioDecoder->m_pFctCreateAudioDec returns 0x%x", - err); - return err; - } - } - -#else - /* Trick, I use pUserData to retrieve aac properties, - waiting for some better implementation... */ - - if( M4DA_StreamTypeAudioAac == audiotype ) - err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctCreateAudioDec( - &pClipCtxt->pAudioDecCtxt, - pClipCtxt->pAudioStream, &(pClipCtxt->AacProperties)); - else - err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctCreateAudioDec( - &pClipCtxt->pAudioDecCtxt, pClipCtxt->pAudioStream, - M4OSA_NULL /* to be changed with HW interfaces */); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipPrepareAudioDecoder:\ - m_pAudioDecoder->m_pFctCreateAudioDec returns 0x%x", - err); - return err; - } - -#endif - - } - - if( M4DA_StreamTypeAudioAmrNarrowBand == audiotype ) { - /* AMR DECODER CONFIGURATION */ - - /* nothing specific to do */ - } - else if( M4DA_StreamTypeAudioEvrc == audiotype ) { - /* EVRC DECODER CONFIGURATION */ - - /* nothing specific to do */ - } - else if( M4DA_StreamTypeAudioMp3 == audiotype ) { - /* MP3 DECODER CONFIGURATION */ - - /* nothing specific to do */ - } - else if( M4DA_StreamTypeAudioAac == audiotype ) - { - /* AAC DECODER CONFIGURATION */ - - /* Decode high quality aac but disable PS and SBR */ - /* Because we have to mix different kind of AAC so we must take the lowest capability */ - /* In MCS it was not needed because there is only one stream */ - M4_AacDecoderConfig AacDecParam; - - AacDecParam.m_AACDecoderProfile = AAC_kAAC; - AacDecParam.m_DownSamplingMode = AAC_kDS_OFF; - - if( M4ENCODER_kMono == pClipCtxt->pAudioStream->m_nbChannels ) - { - AacDecParam.m_OutputMode = AAC_kMono; - } - else - { - AacDecParam.m_OutputMode = AAC_kStereo; - } - - err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctSetOptionAudioDec( - pClipCtxt->pAudioDecCtxt, - M4AD_kOptionID_UserParam, (M4OSA_DataOption) &AacDecParam); - } - - if( M4OSA_NULL != pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctSetOptionAudioDec ) { - pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctSetOptionAudioDec( - pClipCtxt->pAudioDecCtxt, M4AD_kOptionID_3gpReaderInterface, - (M4OSA_DataOption) pClipCtxt->ShellAPI.m_pReaderDataIt); - - pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctSetOptionAudioDec( - pClipCtxt->pAudioDecCtxt, M4AD_kOptionID_AudioAU, - (M4OSA_DataOption) &pClipCtxt->AudioAU); - } - - if( M4OSA_NULL != pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStartAudioDec ) - { - /* Not implemented in all decoders */ - err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStartAudioDec( - pClipCtxt->pAudioDecCtxt); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipPrepareAudioDecoder:\ - m_pAudioDecoder->m_pFctStartAudioDec returns 0x%x", - err); - return err; - } - } - - /** - * Allocate output buffer for the audio decoder */ - pClipCtxt->AudioDecBufferOut.m_bufferSize = - pClipCtxt->pAudioStream->m_byteFrameLength - * pClipCtxt->pAudioStream->m_byteSampleSize - * pClipCtxt->pAudioStream->m_nbChannels; - pClipCtxt->AudioDecBufferOut.m_dataAddress = - (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pClipCtxt->AudioDecBufferOut.m_bufferSize - * sizeof(M4OSA_Int16), - M4VSS3GPP, (M4OSA_Char *)"AudioDecBufferOut.m_bufferSize"); - - if( M4OSA_NULL == pClipCtxt->AudioDecBufferOut.m_dataAddress ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intClipPrepareAudioDecoder():\ - unable to allocate AudioDecBufferOut.m_dataAddress, returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intClipDecodeCurrentAudioFrame() - * @brief Decode the current AUDIO frame. - * @note - * @param pClipCtxt (IN) internal clip context - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intClipDecodeCurrentAudioFrame( - M4VSS3GPP_ClipContext *pClipCtxt ) -{ - M4OSA_ERR err; - - /** - * Silence mode */ - if( pClipCtxt->pSilenceFrameData - == (M4OSA_UInt8 *)pClipCtxt->pAudioFramePtr ) - { - if( pClipCtxt->AudioDecBufferOut.m_dataAddress == M4OSA_NULL ) - { - /** - * Allocate output buffer for the audio decoder */ - pClipCtxt->AudioDecBufferOut.m_bufferSize = - pClipCtxt->uiSilencePcmSize; - pClipCtxt->AudioDecBufferOut.m_dataAddress = - (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc( - pClipCtxt->AudioDecBufferOut.m_bufferSize - * sizeof(M4OSA_Int16), - M4VSS3GPP,(M4OSA_Char *) "AudioDecBufferOut.m_bufferSize"); - - if( M4OSA_NULL == pClipCtxt->AudioDecBufferOut.m_dataAddress ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intClipDecodeCurrentAudioFrame():\ - unable to allocate AudioDecBufferOut.m_dataAddress, returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - } - - /* Fill it with 0 (= pcm silence) */ - memset(pClipCtxt->AudioDecBufferOut.m_dataAddress,0, - pClipCtxt->AudioDecBufferOut.m_bufferSize * sizeof(M4OSA_Int16)); - } - else if (pClipCtxt->pSettings->FileType == M4VIDEOEDITING_kFileType_PCM) - { - pClipCtxt->AudioDecBufferIn.m_dataAddress = (M4OSA_MemAddr8) pClipCtxt->pAudioFramePtr; - pClipCtxt->AudioDecBufferIn.m_bufferSize = pClipCtxt->uiAudioFrameSize; - - memcpy((void *)pClipCtxt->AudioDecBufferOut.m_dataAddress, - (void *)pClipCtxt->AudioDecBufferIn.m_dataAddress, pClipCtxt->AudioDecBufferIn.m_bufferSize); - pClipCtxt->AudioDecBufferOut.m_bufferSize = pClipCtxt->AudioDecBufferIn.m_bufferSize; - /** - * Return with no error */ - - M4OSA_TRACE3_0("M4VSS3GPP_intClipDecodeCurrentAudioFrame(): returning M4NO_ERROR"); - return M4NO_ERROR; - } - /** - * Standard decoding mode */ - else - { - /** - * Decode current AMR frame */ - if ( pClipCtxt->pAudioFramePtr != M4OSA_NULL ) { - pClipCtxt->AudioDecBufferIn.m_dataAddress = - (M4OSA_MemAddr8)pClipCtxt->pAudioFramePtr; - pClipCtxt->AudioDecBufferIn.m_bufferSize = - pClipCtxt->uiAudioFrameSize; - pClipCtxt->AudioDecBufferIn.m_timeStampUs = - (int64_t) (pClipCtxt->iAudioFrameCts * 1000LL); - - err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStepAudioDec( - pClipCtxt->pAudioDecCtxt, - &pClipCtxt->AudioDecBufferIn, &pClipCtxt->AudioDecBufferOut, - M4OSA_FALSE); - } else { - // Pass Null input buffer - // Reader invoked from Audio decoder source - err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStepAudioDec( - pClipCtxt->pAudioDecCtxt, - M4OSA_NULL, &pClipCtxt->AudioDecBufferOut, - M4OSA_FALSE); - } - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipDecodeCurrentAudioFrame():\ - m_pAudioDecoder->m_pFctStepAudio returns 0x%x", - err); - return err; - } - } - - /** - * Return with no error */ - M4OSA_TRACE3_0( - "M4VSS3GPP_intClipDecodeCurrentAudioFrame(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intClipJumpAudioAt() - * @brief Jump in the audio track of the clip. - * @note - * @param pClipCtxt (IN) internal clip context - * @param pJumpCts (IN/OUT) in:target CTS, out: reached CTS - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intClipJumpAudioAt( M4VSS3GPP_ClipContext *pClipCtxt, - M4OSA_Int32 *pJumpCts ) -{ - M4OSA_ERR err; - M4OSA_Int32 iTargetCts; - M4OSA_Int32 iJumpCtsMs; - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipCtxt), M4ERR_PARAMETER, - "M4VSS3GPP_intClipJumpAudioAt: pClipCtxt is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pJumpCts), M4ERR_PARAMETER, - "M4VSS3GPP_intClipJumpAudioAt: pJumpCts is M4OSA_NULL"); - - iTargetCts = *pJumpCts; - - /** - * If there is no audio stream, we simulate a jump at the target jump CTS */ - if( M4OSA_NULL == pClipCtxt->pAudioStream ) - { - /** - * the target CTS will be reached at next ReadFrame call (thus the -20) */ - *pJumpCts = iTargetCts - pClipCtxt->iSilenceFrameDuration; - - /* Patch because m_CTS is unfortunately rounded in 3gp reader shell */ - /* (cts is not an integer with frequency 24 kHz for example) */ - *pJumpCts = ( ( *pJumpCts + pClipCtxt->iSilenceFrameDuration / 2) - / pClipCtxt->iSilenceFrameDuration) - * pClipCtxt->iSilenceFrameDuration; - pClipCtxt->iAudioFrameCts = - * - pJumpCts; /* simulate a read at jump position for later silence AUs */ - } - else - { - M4OSA_Int32 current_time = 0; - M4OSA_Int32 loop_counter = 0; - - if( (M4DA_StreamTypeAudioMp3 - == pClipCtxt->pAudioStream->m_basicProperties.m_streamType) ) - { - while( ( loop_counter < M4VSS3GPP_MP3_JUMPED_AU_NUMBER_MAX) - && (current_time < iTargetCts) ) - { - err = pClipCtxt->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( - pClipCtxt->pReaderContext, - (M4_StreamHandler *)pClipCtxt->pAudioStream, - &pClipCtxt->AudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE3_1( - "M4VSS3GPP_intClipJumpAudioAt: m_pFctGetNextAu() returns 0x%x", - err); - return err; - } - - current_time = (M4OSA_Int32)pClipCtxt->AudioAU.m_CTS; - loop_counter++; - } - - /** - * The current AU is stored */ - pClipCtxt->pAudioFramePtr = pClipCtxt->AudioAU.m_dataAddress; - pClipCtxt->uiAudioFrameSize = - (M4OSA_UInt16)pClipCtxt->AudioAU.m_size; - pClipCtxt->iAudioFrameCts = - (M4OSA_Int32)(pClipCtxt->AudioAU.m_CTS * pClipCtxt->scale_audio - + 0.5); - - *pJumpCts = pClipCtxt->iAudioFrameCts; - } - else - { - /** - * Jump in the audio stream */ - iJumpCtsMs = - (M4OSA_Int32)(*pJumpCts / pClipCtxt->scale_audio + 0.5); - - err = pClipCtxt->ShellAPI.m_pReader->m_pFctJump( - pClipCtxt->pReaderContext, - (M4_StreamHandler *)pClipCtxt->pAudioStream, - &iJumpCtsMs); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipJumpAudioAt(): m_pFctJump() returns 0x%x", - err); - return err; - } - - *pJumpCts = - (M4OSA_Int32)(iJumpCtsMs * pClipCtxt->scale_audio + 0.5); - - /* Patch because m_CTS is unfortunately rounded in 3gp reader shell */ - /* (cts is not an integer with frequency 24 kHz for example) */ - *pJumpCts = ( ( *pJumpCts + pClipCtxt->iSilenceFrameDuration / 2) - / pClipCtxt->iSilenceFrameDuration) - * pClipCtxt->iSilenceFrameDuration; - pClipCtxt->iAudioFrameCts = 0; /* No frame read yet */ - - /** - * To detect some may-be bugs, I prefer to reset all these after a jump */ - pClipCtxt->bAudioFrameAvailable = M4OSA_FALSE; - pClipCtxt->pAudioFramePtr = M4OSA_NULL; - - /** - * In AMR, we have to manage multi-framed AUs, - but also in AAC the jump can be 1 AU too much backward */ - if( *pJumpCts < iTargetCts ) - { - /** - * Jump doesn't read any AU, we must read at least one */ - err = M4VSS3GPP_intClipReadNextAudioFrame(pClipCtxt); - - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipJumpAudioAt():\ - M4VSS3GPP_intClipReadNextAudioFrame(a) returns 0x%x", - err); - return err; - } - - /** - * Read AU frames as long as we reach the AU before the target CTS - * (so the target will be reached when the user call ReadNextAudioFrame). */ - while( pClipCtxt->iAudioFrameCts - < (iTargetCts - pClipCtxt->iSilenceFrameDuration) ) - { - err = M4VSS3GPP_intClipReadNextAudioFrame(pClipCtxt); - - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipJumpAudioAt():\ - M4VSS3GPP_intClipReadNextAudioFrame(b) returns 0x%x", - err); - return err; - } - } - - /** - * Return the CTS that will be reached at next ReadFrame */ - *pJumpCts = pClipCtxt->iAudioFrameCts - + pClipCtxt->iSilenceFrameDuration; - } - } - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intClipJumpAudioAt(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intClipClose() - * @brief Close a clip. Destroy the context. - * @note - * @param pClipCtxt (IN) Internal clip context - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intClipClose( M4VSS3GPP_ClipContext *pClipCtxt ) -{ - M4OSA_ERR err; - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipCtxt), M4ERR_PARAMETER, - "M4VSS3GPP_intClipClose: pClipCtxt is M4OSA_NULL"); - - /** - * Free the video decoder context */ - if( M4OSA_NULL != pClipCtxt->pViDecCtxt ) - { - pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctDestroy( - pClipCtxt->pViDecCtxt); - pClipCtxt->pViDecCtxt = M4OSA_NULL; - } - - /** - * Free the audio decoder context */ - if( M4OSA_NULL != pClipCtxt->pAudioDecCtxt ) - { - err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctDestroyAudioDec( - pClipCtxt->pAudioDecCtxt); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipClose: m_pAudioDecoder->m_pFctDestroyAudioDec returns 0x%x", - err); - /**< don't return, we still have stuff to free */ - } - - pClipCtxt->pAudioDecCtxt = M4OSA_NULL; - } - - /** - * Free the decoded audio buffer */ - if( M4OSA_NULL != pClipCtxt->AudioDecBufferOut.m_dataAddress ) - { - free(pClipCtxt->AudioDecBufferOut.m_dataAddress); - pClipCtxt->AudioDecBufferOut.m_dataAddress = M4OSA_NULL; - } - - /** - * Audio AU is allocated by reader. - * If no audio track, audio AU is set at 'silent' (SID) by VSS. - * As a consequence, if audio AU is set to 'silent' (static) - it can't be free unless it is set to NULL */ - if( ( (M4OSA_MemAddr8)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048 - == pClipCtxt->AudioAU.m_dataAddress) - || ((M4OSA_MemAddr8)pClipCtxt->pSilenceFrameData - == pClipCtxt->AudioAU.m_dataAddress) ) - { - pClipCtxt->AudioAU.m_dataAddress = M4OSA_NULL; - } - - if( M4OSA_NULL != pClipCtxt->pReaderContext ) - { - /** - * Close the 3GPP or MP3 reader */ - err = pClipCtxt->ShellAPI.m_pReader->m_pFctClose( - pClipCtxt->pReaderContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipClose(): m_pReader->m_pFctClose returns 0x%x", - err); - } - - /** - * Destroy the 3GPP or MP3 reader context */ - err = pClipCtxt->ShellAPI.m_pReader->m_pFctDestroy( - pClipCtxt->pReaderContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipClose(): m_pReader->m_pFctDestroy returns 0x%x", - err); - } - - pClipCtxt->pReaderContext = M4OSA_NULL; - } - - /** - * Return with no error */ - M4OSA_TRACE3_1("M4VSS3GPP_intClipClose(Ctxt=0x%x): returning M4NO_ERROR", - pClipCtxt); - return M4NO_ERROR; -} - -M4OSA_ERR M4VSS3GPP_intClipCleanUp( M4VSS3GPP_ClipContext *pClipCtxt ) -{ - M4OSA_ERR err = M4NO_ERROR, err2; - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipCtxt), M4ERR_PARAMETER, - "M4VSS3GPP_intClipCleanUp: pClipCtxt is M4OSA_NULL"); - - /** - * Free the video decoder context */ - if( M4OSA_NULL != pClipCtxt->pViDecCtxt ) - { - pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctDestroy( - pClipCtxt->pViDecCtxt); - pClipCtxt->pViDecCtxt = M4OSA_NULL; - } - - /** - * Free the audio decoder context */ - if( M4OSA_NULL != pClipCtxt->pAudioDecCtxt ) - { - err2 = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctDestroyAudioDec( - pClipCtxt->pAudioDecCtxt); - - if( M4NO_ERROR != err2 ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipCleanUp: m_pAudioDecoder->m_pFctDestroyAudioDec returns 0x%x", - err); - /**< don't return, we still have stuff to free */ - if( M4NO_ERROR != err ) - err = err2; - } - - pClipCtxt->pAudioDecCtxt = M4OSA_NULL; - } - - /** - * Free the decoded audio buffer */ - if( M4OSA_NULL != pClipCtxt->AudioDecBufferOut.m_dataAddress ) - { - free(pClipCtxt->AudioDecBufferOut.m_dataAddress); - pClipCtxt->AudioDecBufferOut.m_dataAddress = M4OSA_NULL; - } - - /** - * Audio AU is allocated by reader. - * If no audio track, audio AU is set at 'silent' (SID) by VSS. - * As a consequence, if audio AU is set to 'silent' (static) - it can't be free unless it is set to NULL */ - if( ( (M4OSA_MemAddr8)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048 - == pClipCtxt->AudioAU.m_dataAddress) - || ((M4OSA_MemAddr8)pClipCtxt->pSilenceFrameData - == pClipCtxt->AudioAU.m_dataAddress) ) - { - pClipCtxt->AudioAU.m_dataAddress = M4OSA_NULL; - } - - if( M4OSA_NULL != pClipCtxt->pReaderContext ) - { - /** - * Close the 3GPP or MP3 reader */ - err2 = pClipCtxt->ShellAPI.m_pReader->m_pFctClose( - pClipCtxt->pReaderContext); - - if( M4NO_ERROR != err2 ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipCleanUp(): m_pReader->m_pFctClose returns 0x%x", - err); - - if( M4NO_ERROR != err ) - err = err2; - } - - /** - * Destroy the 3GPP or MP3 reader context */ - err2 = pClipCtxt->ShellAPI.m_pReader->m_pFctDestroy( - pClipCtxt->pReaderContext); - - if( M4NO_ERROR != err2 ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intClipCleanUp(): m_pReader->m_pFctDestroy returns 0x%x", - err); - - if( M4NO_ERROR != err ) - err = err2; - } - - pClipCtxt->pReaderContext = M4OSA_NULL; - } - - if(pClipCtxt->pPlaneYuv != M4OSA_NULL) { - if(pClipCtxt->pPlaneYuv[0].pac_data != M4OSA_NULL) { - free(pClipCtxt->pPlaneYuv[0].pac_data); - pClipCtxt->pPlaneYuv[0].pac_data = M4OSA_NULL; - } - free(pClipCtxt->pPlaneYuv); - pClipCtxt->pPlaneYuv = M4OSA_NULL; - } - - if(pClipCtxt->pPlaneYuvWithEffect != M4OSA_NULL) { - if(pClipCtxt->pPlaneYuvWithEffect[0].pac_data != M4OSA_NULL) { - free(pClipCtxt->pPlaneYuvWithEffect[0].pac_data); - pClipCtxt->pPlaneYuvWithEffect[0].pac_data = M4OSA_NULL; - } - free(pClipCtxt->pPlaneYuvWithEffect); - pClipCtxt->pPlaneYuvWithEffect = M4OSA_NULL; - } - /** - * Free the shells interfaces */ - M4VSS3GPP_unRegisterAllWriters(&pClipCtxt->ShellAPI); - M4VSS3GPP_unRegisterAllEncoders(&pClipCtxt->ShellAPI); - M4VSS3GPP_unRegisterAllReaders(&pClipCtxt->ShellAPI); - M4VSS3GPP_unRegisterAllDecoders(&pClipCtxt->ShellAPI); - - M4OSA_TRACE3_1("M4VSS3GPP_intClipCleanUp: pClipCtxt=0x%x", pClipCtxt); - /** - * Free the clip context */ - free(pClipCtxt); - - return err; -} - -/** - ****************************************************************************** - * M4OSA_UInt32 M4VSS3GPP_intGetFrameSize_AMRNB() - * @brief Return the length, in bytes, of the AMR Narrow-Band frame contained in the given buffer - * @note - * @param pAudioFrame (IN) AMRNB frame - * @return M4NO_ERROR: No error - ****************************************************************************** - */ - -M4OSA_UInt32 M4VSS3GPP_intGetFrameSize_AMRNB( M4OSA_MemAddr8 pAudioFrame ) -{ - M4OSA_UInt32 frameSize = 0; - M4OSA_UInt32 frameType = ( ( *pAudioFrame) &(0xF << 3)) >> 3; - - switch( frameType ) - { - case 0: - frameSize = 95; - break; /* 4750 bps */ - - case 1: - frameSize = 103; - break; /* 5150 bps */ - - case 2: - frameSize = 118; - break; /* 5900 bps */ - - case 3: - frameSize = 134; - break; /* 6700 bps */ - - case 4: - frameSize = 148; - break; /* 7400 bps */ - - case 5: - frameSize = 159; - break; /* 7950 bps */ - - case 6: - frameSize = 204; - break; /* 10200 bps */ - - case 7: - frameSize = 244; - break; /* 12000 bps */ - - case 8: - frameSize = 39; - break; /* SID (Silence) */ - - case 15: - frameSize = 0; - break; /* No data */ - - default: - M4OSA_TRACE3_0( - "M4VSS3GPP_intGetFrameSize_AMRNB(): Corrupted AMR frame! returning 0."); - return 0; - } - - return (1 + (( frameSize + 7) / 8)); -} - -/** - ****************************************************************************** - * M4OSA_UInt32 M4VSS3GPP_intGetFrameSize_EVRC() - * @brief Return the length, in bytes, of the EVRC frame contained in the given buffer - * @note - * 0 1 2 3 - * +-+-+-+-+ - * |fr type| RFC 3558 - * +-+-+-+-+ - * - * Frame Type: 4 bits - * The frame type indicates the type of the corresponding codec data - * frame in the RTP packet. - * - * For EVRC and SMV codecs, the frame type values and size of the - * associated codec data frame are described in the table below: - * - * Value Rate Total codec data frame size (in octets) - * --------------------------------------------------------- - * 0 Blank 0 (0 bit) - * 1 1/8 2 (16 bits) - * 2 1/4 5 (40 bits; not valid for EVRC) - * 3 1/2 10 (80 bits) - * 4 1 22 (171 bits; 5 padded at end with zeros) - * 5 Erasure 0 (SHOULD NOT be transmitted by sender) - * - * @param pCpAudioFrame (IN) EVRC frame - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -M4OSA_UInt32 M4VSS3GPP_intGetFrameSize_EVRC( M4OSA_MemAddr8 pAudioFrame ) -{ - M4OSA_UInt32 frameSize = 0; - M4OSA_UInt32 frameType = ( *pAudioFrame) &0x0F; - - switch( frameType ) - { - case 0: - frameSize = 0; - break; /* blank */ - - case 1: - frameSize = 16; - break; /* 1/8 */ - - case 2: - frameSize = 40; - break; /* 1/4 */ - - case 3: - frameSize = 80; - break; /* 1/2 */ - - case 4: - frameSize = 171; - break; /* 1 */ - - case 5: - frameSize = 0; - break; /* erasure */ - - default: - M4OSA_TRACE3_0( - "M4VSS3GPP_intGetFrameSize_EVRC(): Corrupted EVRC frame! returning 0."); - return 0; - } - - return (1 + (( frameSize + 7) / 8)); -} - -M4OSA_ERR M4VSS3GPP_intCheckAndGetCodecAacProperties( - M4VSS3GPP_ClipContext *pClipCtxt) { - - M4OSA_ERR err = M4NO_ERROR; - M4AD_Buffer outputBuffer; - uint32_t optionValue =0; - - // Decode first audio frame from clip to get properties from codec - - err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctCreateAudioDec( - &pClipCtxt->pAudioDecCtxt, - pClipCtxt->pAudioStream, &(pClipCtxt->AacProperties)); - - pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctSetOptionAudioDec( - pClipCtxt->pAudioDecCtxt, M4AD_kOptionID_3gpReaderInterface, - (M4OSA_DataOption) pClipCtxt->ShellAPI.m_pReaderDataIt); - - pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctSetOptionAudioDec( - pClipCtxt->pAudioDecCtxt, M4AD_kOptionID_AudioAU, - (M4OSA_DataOption) &pClipCtxt->AudioAU); - - if( pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStartAudioDec != M4OSA_NULL ) { - - err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStartAudioDec( - pClipCtxt->pAudioDecCtxt); - if( M4NO_ERROR != err ) { - - M4OSA_TRACE1_1( - "M4VSS3GPP_intCheckAndGetCodecAacProperties: \ - m_pFctStartAudioDec returns 0x%x", err); - return err; - } - } - - /** - * Allocate output buffer for the audio decoder */ - outputBuffer.m_bufferSize = - pClipCtxt->pAudioStream->m_byteFrameLength - * pClipCtxt->pAudioStream->m_byteSampleSize - * pClipCtxt->pAudioStream->m_nbChannels; - - if( outputBuffer.m_bufferSize > 0 ) { - - outputBuffer.m_dataAddress = - (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(outputBuffer.m_bufferSize \ - *sizeof(short), M4VSS3GPP, (M4OSA_Char *)"outputBuffer.m_bufferSize"); - - if( M4OSA_NULL == outputBuffer.m_dataAddress ) { - - M4OSA_TRACE1_0( - "M4VSS3GPP_intCheckAndGetCodecAacProperties():\ - unable to allocate outputBuffer.m_dataAddress"); - return M4ERR_ALLOC; - } - } - - err = pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctStepAudioDec( - pClipCtxt->pAudioDecCtxt, M4OSA_NULL, &outputBuffer, M4OSA_FALSE); - - if ( err == M4WAR_INFO_FORMAT_CHANGE ) { - - // Get the properties from codec node - pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctGetOptionAudioDec( - pClipCtxt->pAudioDecCtxt, - M4AD_kOptionID_AudioNbChannels, (M4OSA_DataOption) &optionValue); - - pClipCtxt->AacProperties.aNumChan = optionValue; - // Reset Reader structure value also - pClipCtxt->pAudioStream->m_nbChannels = optionValue; - - pClipCtxt->ShellAPI.m_pAudioDecoder->m_pFctGetOptionAudioDec( - pClipCtxt->pAudioDecCtxt, - M4AD_kOptionID_AudioSampFrequency, (M4OSA_DataOption) &optionValue); - - pClipCtxt->AacProperties.aSampFreq = optionValue; - // Reset Reader structure value also - pClipCtxt->pAudioStream->m_samplingFrequency = optionValue; - - } else if( err != M4NO_ERROR) { - M4OSA_TRACE1_1("M4VSS3GPP_intCheckAndGetCodecAacProperties:\ - m_pFctStepAudioDec returns err = 0x%x", err); - } - - free(outputBuffer.m_dataAddress); - - // Reset the stream reader - err = pClipCtxt->ShellAPI.m_pReader->m_pFctReset( - pClipCtxt->pReaderContext, - (M4_StreamHandler *)pClipCtxt->pAudioStream); - - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intCheckAndGetCodecAacProperties\ - Error in reseting reader: 0x%x", err); - } - - return err; - -} diff --git a/libvideoeditor/vss/src/M4VSS3GPP_ClipAnalysis.c b/libvideoeditor/vss/src/M4VSS3GPP_ClipAnalysis.c deleted file mode 100755 index e2c6d7a..0000000 --- a/libvideoeditor/vss/src/M4VSS3GPP_ClipAnalysis.c +++ /dev/null @@ -1,1032 +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 M4VSS3GPP_ClipAnalysis.c - * @brief Implementation of functions related to analysis of input clips - * @note All functions in this file are static, i.e. non public - ****************************************************************************** - */ - -/****************/ -/*** Includes ***/ -/****************/ - -#include "NXPSW_CompilerSwitches.h" -/** - * Our headers */ -#include "M4VSS3GPP_API.h" -#include "M4VSS3GPP_ErrorCodes.h" -#include "M4VSS3GPP_InternalTypes.h" -#include "M4VSS3GPP_InternalFunctions.h" -#include "M4VSS3GPP_InternalConfig.h" -#include "M4VD_EXTERNAL_Interface.h" - - -/** - * OSAL headers */ -#include "M4OSA_Memory.h" /* OSAL memory management */ -#include "M4OSA_Debug.h" /* OSAL debug management */ - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_editAnalyseClip() - * @brief This function allows checking if a clip is compatible with VSS 3GPP editing - * @note It also fills a ClipAnalysis structure, which can be used to check if two - * clips are compatible - * @param pClip (IN) File descriptor of the input 3GPP/MP3 clip file. - * @param pClipProperties (IN) Pointer to a valid ClipProperties structure. - * @param FileType (IN) Type of the input file (.3gp, .amr, .mp3) - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL (debug only) - * @return M4VSS3GPP_ERR_H263_PROFILE_NOT_SUPPORTED - * @return M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION - * @return M4VSS3GPP_ERR_AMR_EDITING_UNSUPPORTED - * @return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_H263_PROFILE - * @return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_MPEG4_PROFILE - * @return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_MPEG4_RVLC - * @return M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT - * @return M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_VIDEO_STREAM_IN_FILE - * @return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT - * @return M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_STREAM_IN_FILE - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_editAnalyseClip( M4OSA_Void *pClip, - M4VIDEOEDITING_FileType FileType, - M4VIDEOEDITING_ClipProperties *pClipProperties, - M4OSA_FileReadPointer *pFileReadPtrFct ) -{ - M4OSA_ERR err; - M4VSS3GPP_ClipContext *pClipContext; - M4VSS3GPP_ClipSettings ClipSettings; - - M4OSA_TRACE3_2( - "M4VSS3GPP_editAnalyseClip called with pClip=0x%x, pClipProperties=0x%x", - pClip, pClipProperties); - - /** - * Check input parameter */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pClip), M4ERR_PARAMETER, - "M4VSS3GPP_editAnalyseClip: pClip is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipProperties), M4ERR_PARAMETER, - "M4VSS3GPP_editAnalyseClip: pClipProperties is M4OSA_NULL"); - - /** - * Build dummy clip settings, in order to use the editClipOpen function */ - ClipSettings.pFile = pClip; - ClipSettings.FileType = FileType; - ClipSettings.uiBeginCutTime = 0; - ClipSettings.uiEndCutTime = 0; - - /* Clip properties not build yet, set at least this flag */ - ClipSettings.ClipProperties.bAnalysed = M4OSA_FALSE; - - /** - * Open the clip in fast open mode */ - err = M4VSS3GPP_intClipInit(&pClipContext, pFileReadPtrFct); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editAnalyseClip: M4VSS3GPP_intClipInit() returns 0x%x!", - err); - - /** - * Free the clip */ - if( M4OSA_NULL != pClipContext ) - { - M4VSS3GPP_intClipCleanUp(pClipContext); - } - return err; - } - - err = M4VSS3GPP_intClipOpen(pClipContext, &ClipSettings, M4OSA_FALSE, - M4OSA_TRUE, M4OSA_TRUE); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editAnalyseClip: M4VSS3GPP_intClipOpen() returns 0x%x!", - err); - - M4VSS3GPP_intClipCleanUp(pClipContext); - - /** - * Here it is better to return the Editing specific error code */ - if( ( ((M4OSA_UInt32)M4ERR_DECODER_H263_PROFILE_NOT_SUPPORTED) == err) - || (((M4OSA_UInt32)M4ERR_DECODER_H263_NOT_BASELINE) == err) ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_editAnalyseClip:\ - M4VSS3GPP_intClipOpen() returns M4VSS3GPP_ERR_H263_PROFILE_NOT_SUPPORTED"); - return M4VSS3GPP_ERR_H263_PROFILE_NOT_SUPPORTED; - } - return err; - } - - /** - * Analyse the clip */ - if(M4VIDEOEDITING_kFileType_ARGB8888 != pClipContext->pSettings->FileType) { - err = M4VSS3GPP_intBuildAnalysis(pClipContext, pClipProperties); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editAnalyseClip: M4VSS3GPP_intBuildAnalysis() returns 0x%x!", - err); - - /** - * Free the clip */ - M4VSS3GPP_intClipCleanUp(pClipContext); - return err; - } - } - /** - * Free the clip */ - err = M4VSS3GPP_intClipClose(pClipContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editAnalyseClip: M4VSS_intClipClose() returns 0x%x!", - err); - M4VSS3GPP_intClipCleanUp(pClipContext); - return err; - } - - M4VSS3GPP_intClipCleanUp(pClipContext); - - /** - * Check the clip is compatible with VSS editing */ - if(M4VIDEOEDITING_kFileType_ARGB8888 != ClipSettings.FileType) { - err = M4VSS3GPP_intCheckClipCompatibleWithVssEditing(pClipProperties); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editAnalyseClip:\ - M4VSS3GPP_intCheckClipCompatibleWithVssEditing() returns 0x%x!", - err); - return err; - } - } - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_editAnalyseClip(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_editCheckClipCompatibility() - * @brief This function allows checking if two clips are compatible with each other for - * VSS 3GPP editing assembly feature. - * @note - * @param pClip1Properties (IN) Clip analysis of the first clip - * @param pClip2Properties (IN) Clip analysis of the second clip - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL (debug only) - * @return M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION - * @return M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_FORMAT - * @return M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_FRAME_SIZE - * @return M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_TIME_SCALE - * @return M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_DATA_PARTITIONING - * @return M4VSS3GPP_ERR_UNSUPPORTED_MP3_ASSEMBLY - * @return M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_editCheckClipCompatibility( M4VIDEOEDITING_ClipProperties *pClip1Properties, - M4VIDEOEDITING_ClipProperties *pClip2Properties ) -{ - M4OSA_ERR err = M4NO_ERROR; - M4OSA_ERR video_err = M4NO_ERROR; - M4OSA_ERR audio_err = M4NO_ERROR; - - M4OSA_Bool bClip1IsAAC = M4OSA_FALSE; - M4OSA_Bool bClip2IsAAC = M4OSA_FALSE; - - M4OSA_TRACE3_2("M4VSS3GPP_editCheckClipCompatibility called with pClip1Analysis=0x%x,\ - pClip2Analysis=0x%x", pClip1Properties, pClip2Properties); - - /** - * Check input parameter */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pClip1Properties), M4ERR_PARAMETER, - "M4VSS3GPP_editCheckClipCompatibility: pClip1Properties is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pClip2Properties), M4ERR_PARAMETER, - "M4VSS3GPP_editCheckClipCompatibility: pClip2Properties is M4OSA_NULL"); - - if( ( M4VIDEOEDITING_kFileType_MP3 == pClip1Properties->FileType) - || (M4VIDEOEDITING_kFileType_AMR == pClip1Properties->FileType) ) - { - if( pClip1Properties != pClip2Properties ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_editCheckClipCompatibility: MP3 CAN ONLY BE CUT,\ - returning M4VSS3GPP_ERR_UNSUPPORTED_MP3_ASSEMBLY"); - return M4VSS3GPP_ERR_UNSUPPORTED_MP3_ASSEMBLY; - } - else - { - /* We are in VSS Splitter mode */ - goto audio_analysis; - } - } - - /********** Audio ************/ - -audio_analysis: - if( M4VIDEOEDITING_kNoneAudio != pClip1Properties-> - AudioStreamType ) /**< if there is an audio stream */ - { - /** - * Check audio format is AAC */ - switch( pClip1Properties->AudioStreamType ) - { - case M4VIDEOEDITING_kAAC: - case M4VIDEOEDITING_kAACplus: - case M4VIDEOEDITING_keAACplus: - bClip1IsAAC = M4OSA_TRUE; - break; - default: - break; - } - } - - if( M4VIDEOEDITING_kNoneAudio != pClip2Properties-> - AudioStreamType ) /**< if there is an audio stream */ - { - /** - * Check audio format is AAC */ - switch( pClip2Properties->AudioStreamType ) - { - case M4VIDEOEDITING_kAAC: - case M4VIDEOEDITING_kAACplus: - case M4VIDEOEDITING_keAACplus: - bClip2IsAAC = M4OSA_TRUE; - break; - default: - break; - } - } - - /** - * If there is no audio, the clips are compatibles ... */ - if( ( pClip1Properties->AudioStreamType != M4VIDEOEDITING_kNoneAudio) - && (pClip2Properties->AudioStreamType != M4VIDEOEDITING_kNoneAudio) ) - { - /** - * Check both clips have same audio stream type - * And let_s say AAC, AAC+ and eAAC+ are mixable */ - if( ( pClip1Properties->AudioStreamType - != pClip2Properties->AudioStreamType) - && (( M4OSA_FALSE == bClip1IsAAC) || (M4OSA_FALSE == bClip2IsAAC)) ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_editCheckClipCompatibility:\ - Clips don't have the same Audio Stream Type"); - - audio_err = M4VSS3GPP_WAR_INCOMPATIBLE_AUDIO_STREAM_TYPE; - goto analysis_done; - } - - /** - * Check both clips have same number of channels */ - if( pClip1Properties->uiNbChannels != pClip2Properties->uiNbChannels ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_editCheckClipCompatibility: Clips don't have the same Nb of Channels"); - audio_err = M4VSS3GPP_WAR_INCOMPATIBLE_AUDIO_NB_OF_CHANNELS; - goto analysis_done; - } - - /** - * Check both clips have same sampling frequency */ - if( pClip1Properties->uiSamplingFrequency - != pClip2Properties->uiSamplingFrequency ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_editCheckClipCompatibility:\ - Clips don't have the same Sampling Frequency"); - audio_err = M4VSS3GPP_WAR_INCOMPATIBLE_AUDIO_SAMPLING_FREQUENCY; - goto analysis_done; - } - } - - pClip2Properties->bAudioIsCompatibleWithMasterClip = M4OSA_TRUE; - - /** - * Return with no error */ - -analysis_done: - if( video_err != M4NO_ERROR ) - return video_err; - - if( audio_err != M4NO_ERROR ) - return audio_err; - - M4OSA_TRACE3_0( - "M4VSS3GPP_editCheckClipCompatibility(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intBuildAnalysis() - * @brief Get video and audio properties from the clip streams - * @note This function must return fatal errors only (errors that should not happen - * in the final integrated product). - * @param pClipCtxt (IN) internal clip context - * @param pClipProperties (OUT) Pointer to a valid ClipProperties structure. - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intBuildAnalysis( M4VSS3GPP_ClipContext *pClipCtxt, - M4VIDEOEDITING_ClipProperties *pClipProperties ) -{ - M4OSA_ERR err; - M4DECODER_MPEG4_DecoderConfigInfo DecConfigInfo; - M4DECODER_VideoSize dummySize; - M4DECODER_AVCProfileLevel AVCProfle; - - pClipProperties->bAnalysed = M4OSA_FALSE; - - /** - * Reset video characteristics */ - pClipProperties->VideoStreamType = M4VIDEOEDITING_kNoneVideo; - pClipProperties->uiClipVideoDuration = 0; - pClipProperties->uiVideoBitrate = 0; - pClipProperties->uiVideoMaxAuSize = 0; - pClipProperties->uiVideoWidth = 0; - pClipProperties->uiVideoHeight = 0; - pClipProperties->uiVideoTimeScale = 0; - pClipProperties->fAverageFrameRate = 0.0; - pClipProperties->uiVideoProfile = - M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE; - pClipProperties->uiVideoLevel = - M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL; - pClipProperties->bMPEG4dataPartition = M4OSA_FALSE; - pClipProperties->bMPEG4rvlc = M4OSA_FALSE; - pClipProperties->bMPEG4resynchMarker = M4OSA_FALSE; - - memset((void *) &pClipProperties->ftyp,0, - sizeof(pClipProperties->ftyp)); - - /** - * Video Analysis */ - if( M4OSA_NULL != pClipCtxt->pVideoStream ) - { - pClipProperties->uiVideoWidth = pClipCtxt->pVideoStream->m_videoWidth; - pClipProperties->uiVideoHeight = pClipCtxt->pVideoStream->m_videoHeight; - pClipProperties->fAverageFrameRate = - pClipCtxt->pVideoStream->m_averageFrameRate; - - switch( pClipCtxt->pVideoStream->m_basicProperties.m_streamType ) - { - case M4DA_StreamTypeVideoMpeg4: - - pClipProperties->VideoStreamType = M4VIDEOEDITING_kMPEG4; - - /* This issue is so incredibly stupid that it's depressing. Basically, a file can be analysed - outside of any context (besides that of the clip itself), so that for instance two clips can - be checked for compatibility before allocating an edit context for editing them. But this - means there is no way in heck to pass an external video decoder (to begin with) to this - function, as they work by being registered in an existing context; furthermore, it is actually - pretty overkill to use a full decoder for that, moreso a HARDWARE decoder just to get the - clip config info. In fact, the hardware itself doesn't provide this service, in the case of a - HW decoder, the shell builds the config info itself, so we don't need the actual decoder, only - a detached functionality of it. So in case HW/external decoders may be present, we instead use - directly the DSI parsing function of the shell HW decoder (which we know to be present, since - HW decoders are possible) to get the config info. Notice this function is used even if the - software decoder is actually present and even if it will end up being actually used: figuring - out the config does not involve actual decoding nor the particularities of a specific decoder, - it's the fact that it's MPEG4 that matters, so it should not be functionally any different - from the way it was done before (and it's light enough for performance not to be any problem - whatsoever). */ - - err = M4DECODER_EXTERNAL_ParseVideoDSI(pClipCtxt->pVideoStream-> - m_basicProperties.m_pDecoderSpecificInfo, - pClipCtxt->pVideoStream->m_basicProperties.m_decoderSpecificInfoSize, - &DecConfigInfo, &dummySize); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intBuildAnalysis():\ - M4DECODER_EXTERNAL_ParseVideoDSI returns 0x%08X", err); - return err; - } - - pClipProperties->uiVideoTimeScale = - DecConfigInfo.uiTimeScale; - pClipProperties->bMPEG4dataPartition = - DecConfigInfo.bDataPartition; - pClipProperties->bMPEG4rvlc = - DecConfigInfo.bUseOfRVLC; - pClipProperties->bMPEG4resynchMarker = - DecConfigInfo.uiUseOfResynchMarker; - err = getMPEG4ProfileAndLevel(DecConfigInfo.uiProfile, - &(pClipProperties->uiVideoProfile), - &(pClipProperties->uiVideoLevel)); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intBuildAnalysis(): \ - getMPEG4ProfileAndLevel returns 0x%08X", err); - return err; - } - break; - - case M4DA_StreamTypeVideoH263: - - pClipProperties->VideoStreamType = M4VIDEOEDITING_kH263; - /* H263 time scale is always 30000 */ - pClipProperties->uiVideoTimeScale = 30000; - - err = getH263ProfileAndLevel(pClipCtxt->pVideoStream-> - m_basicProperties.m_pDecoderSpecificInfo, - pClipCtxt->pVideoStream->m_basicProperties.m_decoderSpecificInfoSize, - &pClipProperties->uiVideoProfile, - &pClipProperties->uiVideoLevel); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intBuildAnalysis(): \ - getH263ProfileAndLevel returns 0x%08X", err); - return err; - } - break; - - case M4DA_StreamTypeVideoMpeg4Avc: - - pClipProperties->VideoStreamType = M4VIDEOEDITING_kH264; - err = getAVCProfileAndLevel(pClipCtxt->pVideoStream-> - m_basicProperties.m_pDecoderSpecificInfo, - pClipCtxt->pVideoStream->m_basicProperties.m_decoderSpecificInfoSize, - &pClipProperties->uiVideoProfile, - &pClipProperties->uiVideoLevel); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intBuildAnalysis(): \ - getAVCProfileAndLevel returns 0x%08X", err); - return err; - } - break; - - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_intBuildAnalysis: unknown input video format (0x%x),\ - returning M4NO_ERROR", - pClipCtxt->pVideoStream->m_basicProperties.m_streamType); - - /** We do not return error here. - * The video format compatibility check will be done latter */ - return M4NO_ERROR; - } - - pClipProperties->uiClipVideoDuration = - (M4OSA_UInt32)pClipCtxt->pVideoStream->m_basicProperties.m_duration; - pClipProperties->uiVideoMaxAuSize = - pClipCtxt->pVideoStream->m_basicProperties.m_maxAUSize; - - /* if video bitrate not available retrieve an estimation of the overall bitrate */ - pClipProperties->uiVideoBitrate = - (M4OSA_UInt32)pClipCtxt->pVideoStream-> - m_basicProperties.m_averageBitRate; - - if( 0 == pClipProperties->uiVideoBitrate ) - { - pClipCtxt->ShellAPI.m_pReader->m_pFctGetOption( - pClipCtxt->pReaderContext, M4READER_kOptionID_Bitrate, - &pClipProperties->uiVideoBitrate); - - if( M4OSA_NULL != pClipCtxt->pAudioStream ) - { - /* we get the overall bitrate, substract the audio bitrate if any */ - pClipProperties->uiVideoBitrate -= - pClipCtxt->pAudioStream->m_basicProperties.m_averageBitRate; - } - } - } - - /** - * Reset audio characteristics */ - pClipProperties->AudioStreamType = M4VIDEOEDITING_kNoneAudio; - pClipProperties->uiClipAudioDuration = 0; - pClipProperties->uiAudioBitrate = 0; - pClipProperties->uiAudioMaxAuSize = 0; - pClipProperties->uiNbChannels = 0; - pClipProperties->uiSamplingFrequency = 0; - pClipProperties->uiExtendedSamplingFrequency = 0; - pClipProperties->uiDecodedPcmSize = 0; - - /** - * Audio Analysis */ - if( M4OSA_NULL != pClipCtxt->pAudioStream ) - { - switch( pClipCtxt->pAudioStream->m_basicProperties.m_streamType ) - { - case M4DA_StreamTypeAudioAmrNarrowBand: - - pClipProperties->AudioStreamType = M4VIDEOEDITING_kAMR_NB; - break; - - case M4DA_StreamTypeAudioAac: - - pClipProperties->AudioStreamType = M4VIDEOEDITING_kAAC; - break; - - case M4DA_StreamTypeAudioMp3: - - pClipProperties->AudioStreamType = M4VIDEOEDITING_kMP3; - break; - - case M4DA_StreamTypeAudioEvrc: - - pClipProperties->AudioStreamType = M4VIDEOEDITING_kEVRC; - break; - - case M4DA_StreamTypeAudioPcm: - - pClipProperties->AudioStreamType = M4VIDEOEDITING_kPCM; - break; - - default: - - M4OSA_TRACE1_1( - "M4VSS3GPP_intBuildAnalysis: unknown input audio format (0x%x),\ - returning M4NO_ERROR!", - pClipCtxt->pAudioStream->m_basicProperties.m_streamType); - return - M4NO_ERROR; /**< We do not return error here. - The audio format compatibility check will be done latter */ - } - - pClipProperties->uiAudioMaxAuSize = - pClipCtxt->pAudioStream->m_basicProperties.m_maxAUSize; - pClipProperties->uiClipAudioDuration = - (M4OSA_UInt32)pClipCtxt->pAudioStream->m_basicProperties.m_duration; - - pClipProperties->uiNbChannels = pClipCtxt->pAudioStream->m_nbChannels; - pClipProperties->uiSamplingFrequency = - pClipCtxt->pAudioStream->m_samplingFrequency; - pClipProperties->uiDecodedPcmSize = - pClipCtxt->pAudioStream->m_byteFrameLength - * pClipCtxt->pAudioStream->m_byteSampleSize - * pClipCtxt->pAudioStream->m_nbChannels; - - /** - * Bugfix P4ME00001128: With some IMTC files, the AMR bit rate is 0 kbps - according the GetProperties function */ - pClipProperties->uiAudioBitrate = - (M4OSA_UInt32)pClipCtxt->pAudioStream-> - m_basicProperties.m_averageBitRate; - - if( 0 == pClipProperties->uiAudioBitrate ) - { - if( M4VIDEOEDITING_kAMR_NB == pClipProperties->AudioStreamType ) - { - /** - *Better returning a guessed 12.2 kbps value than a sure-to-be-false 0 kbps value!*/ - pClipProperties->uiAudioBitrate = M4VSS3GPP_AMR_DEFAULT_BITRATE; - } - else if( M4VIDEOEDITING_kEVRC == pClipProperties->AudioStreamType ) - { - /** - *Better returning a guessed 9.2 kbps value than a sure-to-be-false 0 kbps value!*/ - pClipProperties->uiAudioBitrate = - M4VSS3GPP_EVRC_DEFAULT_BITRATE; - } - else - { - pClipCtxt->ShellAPI.m_pReader->m_pFctGetOption( - pClipCtxt->pReaderContext, M4READER_kOptionID_Bitrate, - &pClipProperties->uiAudioBitrate); - - if( M4OSA_NULL != pClipCtxt->pVideoStream ) - { - /* we get the overall bitrate, substract the video bitrate if any */ - pClipProperties->uiAudioBitrate -= pClipCtxt->pVideoStream-> - m_basicProperties.m_averageBitRate; - } - } - } - - /* New aac properties */ - if( M4DA_StreamTypeAudioAac - == pClipCtxt->pAudioStream->m_basicProperties.m_streamType ) - { - pClipProperties->uiNbChannels = pClipCtxt->AacProperties.aNumChan; - pClipProperties->uiSamplingFrequency = - pClipCtxt->AacProperties.aSampFreq; - - if( pClipCtxt->AacProperties.aSBRPresent ) - { - pClipProperties->AudioStreamType = M4VIDEOEDITING_kAACplus; - pClipProperties->uiExtendedSamplingFrequency = - pClipCtxt->AacProperties.aExtensionSampFreq; - } - - if( pClipCtxt->AacProperties.aPSPresent ) - { - pClipProperties->AudioStreamType = M4VIDEOEDITING_keAACplus; - } - } - } - - /* Get 'ftyp' atom */ - err = pClipCtxt->ShellAPI.m_pReader->m_pFctGetOption( - pClipCtxt->pReaderContext, - M4READER_kOptionID_3gpFtypBox, &pClipProperties->ftyp); - - /** - * We write the VSS 3GPP version in the clip analysis to be sure the integrator doesn't - * mix older analysis results with newer libraries */ - pClipProperties->Version[0] = M4VIDEOEDITING_VERSION_MAJOR; - pClipProperties->Version[1] = M4VIDEOEDITING_VERSION_MINOR; - pClipProperties->Version[2] = M4VIDEOEDITING_VERSION_REVISION; - - pClipProperties->FileType = pClipCtxt->pSettings->FileType; - - if( pClipProperties->uiClipVideoDuration - > pClipProperties->uiClipAudioDuration ) - pClipProperties->uiClipDuration = pClipProperties->uiClipVideoDuration; - else - pClipProperties->uiClipDuration = pClipProperties->uiClipAudioDuration; - - /* Reset compatibility chart */ - pClipProperties->bVideoIsEditable = M4OSA_FALSE; - pClipProperties->bAudioIsEditable = M4OSA_FALSE; - pClipProperties->bVideoIsCompatibleWithMasterClip = M4OSA_FALSE; - pClipProperties->bAudioIsCompatibleWithMasterClip = M4OSA_FALSE; - - /* Analysis successfully completed */ - pClipProperties->bAnalysed = M4OSA_TRUE; - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intBuildAnalysis(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intCheckClipCompatibleWithVssEditing() - * @brief Check if the clip is compatible with VSS editing - * @note - * @param pClipCtxt (IN) internal clip context - * @param pClipProperties (OUT) Pointer to a valid ClipProperties structure. - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intCheckClipCompatibleWithVssEditing( - M4VIDEOEDITING_ClipProperties *pClipProperties ) -{ - M4OSA_UInt32 uiNbOfValidStreams = 0; - M4OSA_ERR video_err = M4NO_ERROR; - M4OSA_ERR audio_err = M4NO_ERROR; - /********* file type *********/ - - if( M4VIDEOEDITING_kFileType_AMR == pClipProperties->FileType ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intCheckClipCompatibleWithVssEditing:\ - returning M4VSS3GPP_ERR_AMR_EDITING_UNSUPPORTED"); - return M4VSS3GPP_ERR_AMR_EDITING_UNSUPPORTED; - } - - if( M4VIDEOEDITING_kFileType_MP3 == pClipProperties->FileType ) - { - M4OSA_TRACE3_0( - "M4VSS3GPP_intCheckClipCompatibleWithVssEditing(): returning M4NO_ERROR"); - return M4NO_ERROR; - } - - /********* Video *********/ - - if( M4VIDEOEDITING_kNoneVideo - != pClipProperties->VideoStreamType ) /**< if there is a video stream */ - { - /* Check video format is MPEG-4, H263 or H264 */ - switch( pClipProperties->VideoStreamType ) - { - case M4VIDEOEDITING_kH263: - case M4VIDEOEDITING_kMPEG4: - case M4VIDEOEDITING_kH264: - uiNbOfValidStreams++; - pClipProperties->bVideoIsEditable = M4OSA_TRUE; - break; - - default: /*< KO, we return error */ - M4OSA_TRACE1_0( - "M4VSS3GPP_intCheckClipCompatibleWithVssEditing(): unsupported video format"); - video_err = M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT; - break; - } - } - else - { - /** - * Audio only stream are currently not supported by the VSS editing feature - (unless in the MP3 case) */ - M4OSA_TRACE1_0( - "M4VSS3GPP_intCheckClipCompatibleWithVssEditing(): No video stream in clip"); - video_err = M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_VIDEO_STREAM_IN_FILE; - } - - /********* Audio *********/ - if( M4VIDEOEDITING_kNoneAudio != pClipProperties-> - AudioStreamType ) /**< if there is an audio stream */ - { - /** - * Check audio format is AMR-NB, EVRC or AAC */ - switch( pClipProperties->AudioStreamType ) - { - case M4VIDEOEDITING_kAMR_NB: - pClipProperties->bAudioIsEditable = M4OSA_TRUE; - uiNbOfValidStreams++; - break; - - case M4VIDEOEDITING_kAAC: - case M4VIDEOEDITING_kAACplus: - case M4VIDEOEDITING_keAACplus: - switch( pClipProperties->uiSamplingFrequency ) - { - case 8000: - case 16000: - case 22050: - case 24000: - case 32000: - case 44100: - case 48000: - pClipProperties->bAudioIsEditable = M4OSA_TRUE; - break; - - default: - break; - } - uiNbOfValidStreams++; - break; - - case M4VIDEOEDITING_kEVRC: - /*< OK, we proceed, no return */ - uiNbOfValidStreams++; - break; - - default: /*< KO, we return error */ - M4OSA_TRACE1_0( - "M4VSS3GPP_intCheckClipCompatibleWithVssEditing(): unsupported audio format"); - audio_err = M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT; - break; - } - } - else - { - /* Silence is always editable */ - pClipProperties->bAudioIsEditable = M4OSA_TRUE; - } - - /** - * Check there is at least one valid stream in the file... */ - if( video_err != M4NO_ERROR ) - return video_err; - - if( audio_err != M4NO_ERROR ) - return audio_err; - - if( 0 == uiNbOfValidStreams ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intCheckClipCompatibleWithVssEditing(): File contains no supported stream,\ - returning M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_STREAM_IN_FILE"); - return M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_STREAM_IN_FILE; - } - - /** - * Return with no error */ - M4OSA_TRACE3_0( - "M4VSS3GPP_intCheckClipCompatibleWithVssEditing(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioMixingCompatibility() - * @brief This function allows checking if two clips are compatible with each other for - * VSS 3GPP audio mixing feature. - * @note - * @param pC (IN) Context of the audio mixer - * @param pInputClipProperties (IN) Clip analysis of the first clip - * @param pAddedClipProperties (IN) Clip analysis of the second clip - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL (debug only) - * @return M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION - * @return M4VSS3GPP_ERR_INPUT_CLIP_IS_NOT_A_3GPP - * @return M4NO_ERROR - ****************************************************************************** - */ -M4OSA_ERR -M4VSS3GPP_intAudioMixingCompatibility( M4VSS3GPP_InternalAudioMixingContext - *pC, M4VIDEOEDITING_ClipProperties *pInputClipProperties, - M4VIDEOEDITING_ClipProperties *pAddedClipProperties ) -{ - M4OSA_Bool bClip1IsAAC = M4OSA_FALSE; - M4OSA_Bool bClip2IsAAC = M4OSA_FALSE; - - /** - * Reset settings */ - pInputClipProperties->bAudioIsEditable = M4OSA_FALSE; - pAddedClipProperties->bAudioIsEditable = M4OSA_FALSE; - pInputClipProperties->bAudioIsCompatibleWithMasterClip = M4OSA_FALSE; - pAddedClipProperties->bAudioIsCompatibleWithMasterClip = M4OSA_FALSE; - - /** - * Check that analysis has been generated by this version of the VSS3GPP library */ - if( ( pInputClipProperties->Version[0] != M4VIDEOEDITING_VERSION_MAJOR) - || (pInputClipProperties->Version[1] != M4VIDEOEDITING_VERSION_MINOR) - || (pInputClipProperties->Version[2] - != M4VIDEOEDITING_VERSION_REVISION) ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingCompatibility: The clip analysis has been generated\ - by another version, returning M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION"); - return M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION; - } - - if( ( pAddedClipProperties->Version[0] != M4VIDEOEDITING_VERSION_MAJOR) - || (pAddedClipProperties->Version[1] != M4VIDEOEDITING_VERSION_MINOR) - || (pAddedClipProperties->Version[2] - != M4VIDEOEDITING_VERSION_REVISION) ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingCompatibility: The clip analysis has been generated\ - by another version, returning M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION"); - return M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION; - } - - /********* input file type *********/ - - if( M4VIDEOEDITING_kFileType_3GPP != pInputClipProperties->FileType ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingCompatibility:\ - returning M4VSS3GPP_ERR_INPUT_CLIP_IS_NOT_A_3GPP"); - return M4VSS3GPP_ERR_INPUT_CLIP_IS_NOT_A_3GPP; - } - - /********* input audio *********/ - - if( M4VIDEOEDITING_kNoneAudio != pInputClipProperties-> - AudioStreamType ) /**< if there is an audio stream */ - { - /** - * Check audio format is AMR-NB or AAC */ - switch( pInputClipProperties->AudioStreamType ) - { - case M4VIDEOEDITING_kAMR_NB: - pInputClipProperties->bAudioIsEditable = M4OSA_TRUE; - break; - - case M4VIDEOEDITING_kAAC: - case M4VIDEOEDITING_kAACplus: - case M4VIDEOEDITING_keAACplus: - switch( pInputClipProperties->uiSamplingFrequency ) - { - case 8000: - case 16000: - case 22050: - case 24000: - case 32000: - case 44100: - case 48000: - pInputClipProperties->bAudioIsEditable = M4OSA_TRUE; - break; - - default: - break; - } - bClip1IsAAC = M4OSA_TRUE; - break; - default: - break; - } - } - else - { - /* Silence is always editable */ - pInputClipProperties->bAudioIsEditable = M4OSA_TRUE; - } - - /********* added audio *********/ - - if( M4VIDEOEDITING_kNoneAudio != pAddedClipProperties-> - AudioStreamType ) /**< if there is an audio stream */ - { - /** - * Check audio format is AMR-NB or AAC */ - switch( pAddedClipProperties->AudioStreamType ) - { - case M4VIDEOEDITING_kAMR_NB: - pAddedClipProperties->bAudioIsEditable = M4OSA_TRUE; - pAddedClipProperties->bAudioIsCompatibleWithMasterClip = - M4OSA_TRUE; /* I use this field to know if silence supported */ - break; - - case M4VIDEOEDITING_kAAC: - case M4VIDEOEDITING_kAACplus: - case M4VIDEOEDITING_keAACplus: - switch( pAddedClipProperties->uiSamplingFrequency ) - { - case 8000: - case 16000: - case 22050: - case 24000: - case 32000: - case 44100: - case 48000: - pAddedClipProperties->bAudioIsEditable = M4OSA_TRUE; - break; - - default: - break; - } - pAddedClipProperties->bAudioIsCompatibleWithMasterClip = - M4OSA_TRUE; /* I use this field to know if silence supported */ - bClip2IsAAC = M4OSA_TRUE; - break; - - case M4VIDEOEDITING_kEVRC: - break; - - case M4VIDEOEDITING_kPCM: - pAddedClipProperties->bAudioIsEditable = M4OSA_TRUE; - pAddedClipProperties->bAudioIsCompatibleWithMasterClip = - M4OSA_TRUE; /* I use this field to know if silence supported */ - - if( pAddedClipProperties->uiSamplingFrequency == 16000 ) - { - bClip2IsAAC = M4OSA_TRUE; - } - break; - - case M4VIDEOEDITING_kMP3: /*RC*/ - pAddedClipProperties->bAudioIsEditable = M4OSA_TRUE; - pAddedClipProperties->bAudioIsCompatibleWithMasterClip = - M4OSA_TRUE; /* I use this field to know if silence supported */ - break; - - default: - /* The writer cannot write this into a 3gpp */ - M4OSA_TRACE1_0( - "M4VSS3GPP_intAudioMixingCompatibility:\ - returning M4VSS3GPP_ERR_UNSUPPORTED_ADDED_AUDIO_STREAM"); - return M4VSS3GPP_ERR_UNSUPPORTED_ADDED_AUDIO_STREAM; - } - } - else - { - /* Silence is always editable */ - pAddedClipProperties->bAudioIsEditable = M4OSA_TRUE; - pAddedClipProperties->bAudioIsCompatibleWithMasterClip = - M4OSA_TRUE; /* I use this field to know if silence supported */ - } - - if( pC->bRemoveOriginal == M4OSA_FALSE ) - { - if( pInputClipProperties->uiSamplingFrequency - != pAddedClipProperties->uiSamplingFrequency ) - { - /* We need to call SSRC in order to align ASF and/or nb of channels */ - /* Moreover, audio encoder may be needed in case of audio replacing... */ - pC->b_SSRCneeded = M4OSA_TRUE; - } - - if( pInputClipProperties->uiNbChannels - < pAddedClipProperties->uiNbChannels ) - { - /* Stereo to Mono */ - pC->ChannelConversion = 1; - } - else if( pInputClipProperties->uiNbChannels - > pAddedClipProperties->uiNbChannels ) - { - /* Mono to Stereo */ - pC->ChannelConversion = 2; - } - } - - pInputClipProperties->bAudioIsCompatibleWithMasterClip = M4OSA_TRUE; - - /** - * Return with no error */ - M4OSA_TRACE3_0( - "M4VSS3GPP_intAudioMixingCompatibility(): returning M4NO_ERROR"); - return M4NO_ERROR; -} diff --git a/libvideoeditor/vss/src/M4VSS3GPP_Codecs.c b/libvideoeditor/vss/src/M4VSS3GPP_Codecs.c deleted file mode 100755 index 1ced937..0000000 --- a/libvideoeditor/vss/src/M4VSS3GPP_Codecs.c +++ /dev/null @@ -1,1037 +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 M4VSS3GPP_Codecs.c - * @brief VSS implementation - * @note This file contains all functions related to audio/video - * codec manipulations. - ************************************************************************* - */ - -#include "NXPSW_CompilerSwitches.h" - -#include "M4OSA_Debug.h" /**< Include for OSAL debug services */ -#include "M4VSS3GPP_ErrorCodes.h" -#include "M4VSS3GPP_InternalTypes.h" /**< Internal types of the VSS */ - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_clearInterfaceTables() - * @brief Clear encoders, decoders, reader and writers interfaces tables - * @param pContext (IN/OUT) VSS context. - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: The context is null - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_clearInterfaceTables( M4VSS3GPP_MediaAndCodecCtxt *pC ) -{ - M4OSA_UInt8 i; - - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - - /* Initialisation that will allow to check if registering twice */ - pC->pWriterGlobalFcts = M4OSA_NULL; - pC->pWriterDataFcts = M4OSA_NULL; - pC->pVideoEncoderGlobalFcts = M4OSA_NULL; - pC->pAudioEncoderGlobalFcts = M4OSA_NULL; - pC->pCurrentAudioEncoderUserData = M4OSA_NULL; - pC->pCurrentAudioDecoderUserData = M4OSA_NULL; - - pC->pCurrentVideoEncoderExternalAPI = M4OSA_NULL; - pC->pCurrentVideoEncoderUserData = M4OSA_NULL; - - for ( i = 0; i < M4WRITER_kType_NB; i++ ) - { - pC->WriterInterface[i].pGlobalFcts = M4OSA_NULL; - pC->WriterInterface[i].pDataFcts = M4OSA_NULL; - } - - for ( i = 0; i < M4ENCODER_kVideo_NB; i++ ) - { - pC->pVideoEncoderInterface[i] = M4OSA_NULL; - pC->pVideoEncoderExternalAPITable[i] = M4OSA_NULL; - pC->pVideoEncoderUserDataTable[i] = M4OSA_NULL; - } - - for ( i = 0; i < M4ENCODER_kAudio_NB; i++ ) - { - pC->pAudioEncoderInterface[i] = M4OSA_NULL; - pC->pAudioEncoderFlag[i] = M4OSA_FALSE; - pC->pAudioEncoderUserDataTable[i] = M4OSA_NULL; - } - - /* Initialisation that will allow to check if registering twice */ - pC->m_pReader = M4OSA_NULL; - pC->m_pReaderDataIt = M4OSA_NULL; - pC->m_uiNbRegisteredReaders = 0; - - for ( i = 0; i < M4READER_kMediaType_NB; i++ ) - { - pC->m_pReaderGlobalItTable[i] = M4OSA_NULL; - pC->m_pReaderDataItTable[i] = M4OSA_NULL; - } - - pC->m_pVideoDecoder = M4OSA_NULL; -#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS - - pC->m_pCurrentVideoDecoderUserData = M4OSA_NULL; -#endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */ - - pC->m_uiNbRegisteredVideoDec = 0; - - for ( i = 0; i < M4DECODER_kVideoType_NB; i++ ) - { - pC->m_pVideoDecoderItTable[i] = M4OSA_NULL; -#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS - - pC->m_pVideoDecoderUserDataTable[i] = M4OSA_NULL; - -#endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */ - - } - - pC->m_pAudioDecoder = M4OSA_NULL; - - for ( i = 0; i < M4AD_kType_NB; i++ ) - { - pC->m_pAudioDecoderItTable[i] = M4OSA_NULL; - pC->m_pAudioDecoderFlagTable[i] = M4OSA_FALSE; - pC->pAudioDecoderUserDataTable[i] = M4OSA_NULL; - } - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_registerWriter() - * @brief This function will register a specific file format writer. - * @note According to the Mediatype, this function will store in the internal - * context the writer context. - * @param pContext: (IN) Execution context. - * @return M4NO_ERROR: there is no error - * @return M4ERR_PARAMETER pContext,pWtrGlobalInterface or pWtrDataInterface is M4OSA_NULL - * (debug only), or invalid MediaType - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_registerWriter( M4VSS3GPP_MediaAndCodecCtxt *pC, - M4WRITER_OutputFileType MediaType, - M4WRITER_GlobalInterface *pWtrGlobalInterface, - M4WRITER_DataInterface *pWtrDataInterface ) -{ - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((pC == M4OSA_NULL), M4ERR_PARAMETER, - "VSS: context is M4OSA_NULL in M4VSS3GPP_registerWriter"); - M4OSA_DEBUG_IF2((pWtrGlobalInterface == M4OSA_NULL), M4ERR_PARAMETER, - "pWtrGlobalInterface is M4OSA_NULL in M4VSS3GPP_registerWriter"); - M4OSA_DEBUG_IF2((pWtrDataInterface == M4OSA_NULL), M4ERR_PARAMETER, - "pWtrDataInterface is M4OSA_NULL in M4VSS3GPP_registerWriter"); - - M4OSA_TRACE3_3( - "VSS: M4VSS3GPP_registerWriter called with pContext=0x%x, pWtrGlobalInterface=0x%x,\ - pWtrDataInterface=0x%x", - pC, pWtrGlobalInterface, pWtrDataInterface); - - if( ( MediaType == M4WRITER_kUnknown) || (MediaType >= M4WRITER_kType_NB) ) - { - M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER, "Invalid media type"); - return M4ERR_PARAMETER; - } - - if( pC->WriterInterface[MediaType].pGlobalFcts != M4OSA_NULL ) - { - /* a writer corresponding to this media type has already been registered !*/ - M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER, - "This media type has already been registered"); - return M4ERR_PARAMETER; - } - - /* - * Save writer interface in context */ - pC->WriterInterface[MediaType].pGlobalFcts = pWtrGlobalInterface; - pC->WriterInterface[MediaType].pDataFcts = pWtrDataInterface; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_registerVideoEncoder() - * @brief This function will register a specific video encoder. - * @note According to the Mediatype, this function will store in the internal - * context the encoder context. - * @param pContext: (IN) Execution context. - * @return M4NO_ERROR: there is no error - * @return M4ERR_PARAMETER pContext or pEncGlobalInterface is M4OSA_NULL (debug only), - * or invalid MediaType - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_registerVideoEncoder( M4VSS3GPP_MediaAndCodecCtxt *pC, - M4ENCODER_Format MediaType, - M4ENCODER_GlobalInterface *pEncGlobalInterface ) -{ - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((pC == M4OSA_NULL), M4ERR_PARAMETER, - "VSS: context is M4OSA_NULL in M4VSS3GPP_registerVideoEncoder"); - M4OSA_DEBUG_IF2((pEncGlobalInterface == M4OSA_NULL), M4ERR_PARAMETER, - "pEncGlobalInterface is M4OSA_NULL in M4VSS3GPP_registerVideoEncoder"); - - M4OSA_TRACE3_3( - "VSS: M4VSS3GPP_registerEncoder called with pContext=0x%x, pEncGlobalInterface=0x%x,\ - MediaType=0x%x", - pC, pEncGlobalInterface, MediaType); - - if( MediaType >= M4ENCODER_kVideo_NB ) - { - M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER, - "Invalid video encoder type"); - return M4ERR_PARAMETER; - } - - if( pC->pVideoEncoderInterface[MediaType] != M4OSA_NULL ) - { - /* can be legitimate, in cases where we have one version that can use external encoders - but which still has the built-in one to be able to work without an external encoder; in - this case the new encoder simply replaces the old one (i.e. we unregister it first). */ -#ifdef M4VSS_SUPPORT_OMX_CODECS - - if( M4OSA_TRUE == pC->bAllowFreeingOMXCodecInterface ) - { - -#endif - - free(pC->pVideoEncoderInterface[MediaType]); -#ifdef M4VSS_SUPPORT_OMX_CODECS - - } - -#endif - - pC->pVideoEncoderInterface[MediaType] = M4OSA_NULL; - } - - /* - * Save encoder interface in context */ - pC->pVideoEncoderInterface[MediaType] = pEncGlobalInterface; - /* The actual userData and external API will be set by the registration function in the case - of an external encoder (add it as a parameter to this function in the long run?) */ - pC->pVideoEncoderUserDataTable[MediaType] = M4OSA_NULL; - pC->pVideoEncoderExternalAPITable[MediaType] = M4OSA_NULL; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_registerAudioEncoder() - * @brief This function will register a specific audio encoder. - * @note According to the Mediatype, this function will store in the internal - * context the encoder context. - * @param pContext: (IN) Execution context. - * @param mediaType: (IN) The media type. - * @param pEncGlobalInterface: (OUT) the encoder interface functions. - * @return M4NO_ERROR: there is no error - * @return M4ERR_PARAMETER: pContext or pEncGlobalInterface is M4OSA_NULL (debug only) - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_registerAudioEncoder( M4VSS3GPP_MediaAndCodecCtxt *pC, - M4ENCODER_AudioFormat MediaType, - M4ENCODER_AudioGlobalInterface *pEncGlobalInterface ) -{ - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((pC == M4OSA_NULL), M4ERR_PARAMETER, - "VSS: context is M4OSA_NULL in M4VSS3GPP_registerAudioEncoder"); - M4OSA_DEBUG_IF2((pEncGlobalInterface == M4OSA_NULL), M4ERR_PARAMETER, - "pEncGlobalInterface is M4OSA_NULL in M4VSS3GPP_registerAudioEncoder"); - - M4OSA_TRACE3_3( - "VSS: M4VSS3GPP_registerAudioEncoder called pContext=0x%x, pEncGlobalInterface=0x%x,\ - MediaType=0x%x", - pC, pEncGlobalInterface, MediaType); - - if( MediaType >= M4ENCODER_kAudio_NB ) - { - M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER, - "Invalid audio encoder type"); - return M4ERR_PARAMETER; - } - - if( pC->pAudioEncoderInterface[MediaType] != M4OSA_NULL ) - { - free(pC->pAudioEncoderInterface[MediaType]); - pC->pAudioEncoderInterface[MediaType] = M4OSA_NULL; - } - /* - * Save encoder interface in context */ - pC->pAudioEncoderInterface[MediaType] = pEncGlobalInterface; - pC->pAudioEncoderFlag[MediaType] = M4OSA_FALSE; /* internal encoder */ - pC->pAudioEncoderUserDataTable[MediaType] = M4OSA_NULL; - - M4OSA_TRACE3_2( - "M4VSS3GPP_registerAudioEncoder: pC->pAudioEncoderInterface[0x%x] = 0x%x", - MediaType, pC->pAudioEncoderInterface[MediaType]); - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_registerReader() - * @brief Register reader. - * @param pContext (IN/OUT) VSS context. - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: A parameter is null (in DEBUG only) - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_registerReader( M4VSS3GPP_MediaAndCodecCtxt *pC, - M4READER_MediaType mediaType, - M4READER_GlobalInterface *pRdrGlobalInterface, - M4READER_DataInterface *pRdrDataInterface ) -{ - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - M4OSA_DEBUG_IF1((M4OSA_NULL == pRdrGlobalInterface), M4ERR_PARAMETER, - "M4VSS3GPP_registerReader: invalid pointer on global interface"); - M4OSA_DEBUG_IF1((M4OSA_NULL == pRdrDataInterface), M4ERR_PARAMETER, - "M4VSS3GPP_registerReader: invalid pointer on data interface"); - - if( mediaType == M4READER_kMediaTypeUnknown - || mediaType >= M4READER_kMediaType_NB ) - { - M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER, "Invalid media type"); - return M4ERR_PARAMETER; - } - - if( pC->m_pReaderGlobalItTable[mediaType] != M4OSA_NULL ) - { - /* a reader corresponding to this media type has already been registered !*/ - M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER, - "This media type has already been registered"); - return M4ERR_PARAMETER; - } - - pC->m_pReaderGlobalItTable[mediaType] = pRdrGlobalInterface; - pC->m_pReaderDataItTable[mediaType] = pRdrDataInterface; - - pC->m_uiNbRegisteredReaders++; - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_registerVideoDecoder() - * @brief Register video decoder - * @param pContext (IN/OUT) VSS context. - * @param decoderType (IN) Decoder type - * @param pDecoderInterface (IN) Decoder interface. - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: A parameter is null (in DEBUG only), - * or the decoder type is invalid - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_registerVideoDecoder( M4VSS3GPP_MediaAndCodecCtxt *pC, - M4DECODER_VideoType decoderType, - M4DECODER_VideoInterface *pDecoderInterface ) -{ - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - M4OSA_DEBUG_IF1((M4OSA_NULL == pDecoderInterface), M4ERR_PARAMETER, - "M4VSS3GPP_registerVideoDecoder: invalid pointer on decoder interface"); - - if( decoderType >= M4DECODER_kVideoType_NB ) - { - M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER, - "Invalid video decoder type"); - return M4ERR_PARAMETER; - } - - if( pC->m_pVideoDecoderItTable[decoderType] != M4OSA_NULL ) - { -#ifndef M4VSS_ENABLE_EXTERNAL_DECODERS - /* a decoder corresponding to this media type has already been registered !*/ - - M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER, - "Decoder has already been registered"); - return M4ERR_PARAMETER; - -#else /* external decoders are possible */ - /* can be legitimate, in cases where we have one version that can use external decoders - but which still has the built-in one to be able to work without an external decoder; in - this case the new decoder simply replaces the old one (i.e. we unregister it first). */ -#ifdef M4VSS_SUPPORT_OMX_CODECS - - if( M4OSA_TRUE == pC->bAllowFreeingOMXCodecInterface ) - { - -#endif - - free(pC->m_pVideoDecoderItTable[decoderType]); -#ifdef M4VSS_SUPPORT_OMX_CODECS - - } - -#endif - - pC->m_pVideoDecoderItTable[decoderType] = M4OSA_NULL; - /* oh, and don't forget the user data, too. */ - if( pC->m_pVideoDecoderUserDataTable[decoderType] != M4OSA_NULL ) - { - free(pC->m_pVideoDecoderUserDataTable[decoderType]); - pC->m_pVideoDecoderUserDataTable[decoderType] = M4OSA_NULL; - } -#endif /* are external decoders possible? */ - - } - - pC->m_pVideoDecoderItTable[decoderType] = pDecoderInterface; -#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS - - pC->m_pVideoDecoderUserDataTable[decoderType] = M4OSA_NULL; - /* The actual userData will be set by the registration function in the case - of an external decoder (add it as a parameter to this function in the long run?) */ - -#endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */ - - pC->m_uiNbRegisteredVideoDec++; - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_registerAudioDecoder() - * @brief Register audio decoder - * @note This function is used internaly by the VSS to register NXP audio decoders, - * @param context (IN/OUT) VSS context. - * @param decoderType (IN) Audio decoder type - * @param pDecoderInterface (IN) Audio decoder interface. - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: A parameter is null, or the decoder type is invalid(in DEBUG only) - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_registerAudioDecoder( M4VSS3GPP_MediaAndCodecCtxt *pC, - M4AD_Type decoderType, M4AD_Interface *pDecoderInterface) -{ - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - M4OSA_DEBUG_IF1((M4OSA_NULL == pDecoderInterface), M4ERR_PARAMETER, - "M4VSS3GPP_registerAudioDecoder: invalid pointer on decoder interface"); - - if( decoderType >= M4AD_kType_NB ) - { - M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER, - "Invalid audio decoder type"); - return M4ERR_PARAMETER; - } - if(M4OSA_NULL != pC->m_pAudioDecoderItTable[decoderType]) - { - free(pC->m_pAudioDecoderItTable[decoderType]); - pC->m_pAudioDecoderItTable[decoderType] = M4OSA_NULL; - - if(M4OSA_NULL != pC->m_pAudioDecoderItTable[decoderType]) - { - free(pC->m_pAudioDecoderItTable[decoderType]); - pC->m_pAudioDecoderItTable[decoderType] = M4OSA_NULL; - } - } - - - - pC->m_pAudioDecoderItTable[decoderType] = pDecoderInterface; - pC->m_pAudioDecoderFlagTable[decoderType] = - M4OSA_FALSE; /* internal decoder */ - pC->pAudioDecoderUserDataTable[decoderType] = M4OSA_NULL; - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_unRegisterAllWriters() - * @brief Unregister writer - * @param pContext (IN/OUT) VSS context. - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: A parameter is null (in DEBUG only) - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_unRegisterAllWriters( M4VSS3GPP_MediaAndCodecCtxt *pC ) -{ - M4OSA_Int32 i; - - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - - for ( i = 0; i < M4WRITER_kType_NB; i++ ) - { - if( pC->WriterInterface[i].pGlobalFcts != M4OSA_NULL ) - { - free(pC->WriterInterface[i].pGlobalFcts); - pC->WriterInterface[i].pGlobalFcts = M4OSA_NULL; - } - - if( pC->WriterInterface[i].pDataFcts != M4OSA_NULL ) - { - free(pC->WriterInterface[i].pDataFcts); - pC->WriterInterface[i].pDataFcts = M4OSA_NULL; - } - } - - pC->pWriterGlobalFcts = M4OSA_NULL; - pC->pWriterDataFcts = M4OSA_NULL; - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_unRegisterAllEncoders() - * @brief Unregister the encoders - * @param pContext (IN/OUT) VSS context. - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: A parameter is null (in DEBUG only) - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_unRegisterAllEncoders( M4VSS3GPP_MediaAndCodecCtxt *pC ) -{ - M4OSA_Int32 i; - - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - M4OSA_TRACE3_1("M4VSS3GPP_unRegisterAllEncoders: pC=0x%x", pC); - - for ( i = 0; i < M4ENCODER_kVideo_NB; i++ ) - { - if( pC->pVideoEncoderInterface[i] != M4OSA_NULL ) - { -#ifdef M4VSS_SUPPORT_OMX_CODECS - - if( M4OSA_TRUE == pC->bAllowFreeingOMXCodecInterface ) - { - -#endif - - free(pC->pVideoEncoderInterface[i]); -#ifdef M4VSS_SUPPORT_OMX_CODECS - - } - -#endif - - pC->pVideoEncoderInterface[i] = M4OSA_NULL; - } - } - - for ( i = 0; i < M4ENCODER_kAudio_NB; i++ ) - { - if( pC->pAudioEncoderInterface[i] != M4OSA_NULL ) - { -#ifdef M4VSS_SUPPORT_OMX_CODECS - - if( M4OSA_TRUE == pC->bAllowFreeingOMXCodecInterface ) - { - -#endif - /*Don't free external audio encoders interfaces*/ - - if( M4OSA_FALSE == pC->pAudioEncoderFlag[i] ) - { - free(pC->pAudioEncoderInterface[i]); - } -#ifdef M4VSS_SUPPORT_OMX_CODECS - - } - -#endif - - pC->pAudioEncoderInterface[i] = M4OSA_NULL; - } - } - - pC->pVideoEncoderGlobalFcts = M4OSA_NULL; - pC->pAudioEncoderGlobalFcts = M4OSA_NULL; - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_unRegisterAllReaders() - * @brief Unregister reader - * @param pContext (IN/OUT) VSS context. - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: A parameter is null (in DEBUG only) - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_unRegisterAllReaders( M4VSS3GPP_MediaAndCodecCtxt *pC ) -{ - M4OSA_Int32 i; - - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - - for ( i = 0; i < M4READER_kMediaType_NB; i++ ) - { - if( pC->m_pReaderGlobalItTable[i] != M4OSA_NULL ) - { - free(pC->m_pReaderGlobalItTable[i]); - pC->m_pReaderGlobalItTable[i] = M4OSA_NULL; - } - - if( pC->m_pReaderDataItTable[i] != M4OSA_NULL ) - { - free(pC->m_pReaderDataItTable[i]); - pC->m_pReaderDataItTable[i] = M4OSA_NULL; - } - } - - pC->m_uiNbRegisteredReaders = 0; - pC->m_pReader = M4OSA_NULL; - pC->m_pReaderDataIt = M4OSA_NULL; - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_unRegisterAllDecoders() - * @brief Unregister the decoders - * @param pContext (IN/OUT) VSS context. - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: A parameter is null (in DEBUG only) - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_unRegisterAllDecoders( M4VSS3GPP_MediaAndCodecCtxt *pC ) -{ - M4OSA_Int32 i; - - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - M4OSA_TRACE3_1("M4VSS3GPP_unRegisterAllDecoders: pC=0x%x", pC); - - for ( i = 0; i < M4DECODER_kVideoType_NB; i++ ) - { - if( pC->m_pVideoDecoderItTable[i] != M4OSA_NULL ) - { -#ifdef M4VSS_SUPPORT_OMX_CODECS - - if( M4OSA_TRUE == pC->bAllowFreeingOMXCodecInterface ) - { - -#endif - - free(pC->m_pVideoDecoderItTable[i]); -#ifdef M4VSS_SUPPORT_OMX_CODECS - - } - -#endif - - pC->m_pVideoDecoderItTable[i] = M4OSA_NULL; - - } - } - - for ( i = 0; i < M4AD_kType_NB; i++ ) - { - if( pC->m_pAudioDecoderItTable[i] != M4OSA_NULL ) - { -#ifdef M4VSS_SUPPORT_OMX_CODECS - - if( M4OSA_TRUE == pC->bAllowFreeingOMXCodecInterface ) - { - -#endif - /*Don't free external audio decoders interfaces*/ - - if( M4OSA_FALSE == pC->m_pAudioDecoderFlagTable[i] ) - { - free(pC->m_pAudioDecoderItTable[i]); - } -#ifdef M4VSS_SUPPORT_OMX_CODECS - - } - -#endif - - pC->m_pAudioDecoderItTable[i] = M4OSA_NULL; - } - } - - pC->m_uiNbRegisteredVideoDec = 0; - pC->m_pVideoDecoder = M4OSA_NULL; - - pC->m_pAudioDecoder = M4OSA_NULL; - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_setCurrentWriter() - * @brief Set current writer - * @param pContext (IN/OUT) VSS context. - * @param mediaType (IN) Media type. - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: A parameter is null (in DEBUG only) - * @return M4WAR_VSS_MEDIATYPE_NOT_SUPPORTED: Media type not supported - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_setCurrentWriter( M4VSS3GPP_MediaAndCodecCtxt *pC, - M4VIDEOEDITING_FileType mediaType ) -{ - M4WRITER_OutputFileType writerType; - - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - - switch( mediaType ) - { - case M4VIDEOEDITING_kFileType_3GPP: - writerType = M4WRITER_k3GPP; - break; - default: - M4OSA_DEBUG_IF1(M4OSA_TRUE, M4VSS3GPP_ERR_INVALID_FILE_TYPE, - "Writer type not supported"); - return M4VSS3GPP_ERR_INVALID_FILE_TYPE; - } - - pC->pWriterGlobalFcts = pC->WriterInterface[writerType].pGlobalFcts; - pC->pWriterDataFcts = pC->WriterInterface[writerType].pDataFcts; - - if( pC->pWriterGlobalFcts == M4OSA_NULL - || pC->pWriterDataFcts == M4OSA_NULL ) - { - M4OSA_DEBUG_IF1(M4OSA_TRUE, M4VSS3GPP_ERR_INVALID_FILE_TYPE, - "Writer type not supported"); - M4OSA_TRACE1_0("Writer type not supported"); - return M4VSS3GPP_ERR_INVALID_FILE_TYPE; - } - - pC->pWriterDataFcts->pWriterContext = M4OSA_NULL; - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_setCurrentVideoEncoder() - * @brief Set a video encoder - * @param pContext (IN/OUT) VSS context. - * @param MediaType (IN) Encoder type - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: A parameter is null (in DEBUG only) - * @return M4WAR_VSS_MEDIATYPE_NOT_SUPPORTED: Media type not supported - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_setCurrentVideoEncoder( M4VSS3GPP_MediaAndCodecCtxt *pC, - M4SYS_StreamType mediaType ) -{ - M4ENCODER_Format encoderType; - - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - M4OSA_TRACE3_2("M4VSS3GPP_setCurrentVideoEncoder: pC=0x%x, mediaType=0x%x", - pC, mediaType); - - switch( mediaType ) - { - case M4SYS_kH263: - encoderType = M4ENCODER_kH263; - break; - - case M4SYS_kMPEG_4: - encoderType = M4ENCODER_kMPEG4; - break; - - case M4SYS_kH264: - encoderType = M4ENCODER_kH264; - break; - - default: - M4OSA_DEBUG_IF1(M4OSA_TRUE, - M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT, - "Video encoder type not supported"); - return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT; - } - - pC->pVideoEncoderGlobalFcts = pC->pVideoEncoderInterface[encoderType]; - pC->pCurrentVideoEncoderExternalAPI = - pC->pVideoEncoderExternalAPITable[encoderType]; - pC->pCurrentVideoEncoderUserData = - pC->pVideoEncoderUserDataTable[encoderType]; - - if( pC->pVideoEncoderGlobalFcts == M4OSA_NULL ) - { - M4OSA_DEBUG_IF1(M4OSA_TRUE, - M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT, - "Video encoder type not supported"); - M4OSA_TRACE1_0("Video encoder type not supported"); - return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT; - } - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_setCurrentAudioEncoder() - * @brief Set an audio encoder - * @param context (IN/OUT) VSS context. - * @param MediaType (IN) Encoder type - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: A parameter is null (in DEBUG only) - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_setCurrentAudioEncoder( M4VSS3GPP_MediaAndCodecCtxt *pC, - M4SYS_StreamType mediaType ) -{ - M4ENCODER_AudioFormat encoderType; - - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - M4OSA_TRACE3_2("M4VSS3GPP_setCurrentAudioEncoder: pC=0x%x, mediaType=0x%x", - pC, mediaType); - - switch( mediaType ) - { - case M4SYS_kAMR: - M4OSA_TRACE3_0( - "M4VSS3GPP_setCurrentAudioEncoder: encoder type AMR"); - encoderType = M4ENCODER_kAMRNB; - break; - - case M4SYS_kAAC: - M4OSA_TRACE3_0( - "M4VSS3GPP_setCurrentAudioEncoder: encoder type AAC"); - encoderType = M4ENCODER_kAAC; - break; - - default: - M4OSA_DEBUG_IF1(M4OSA_TRUE, - M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT, - "Audio encoder type not supported"); - return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT; - } - - pC->pAudioEncoderGlobalFcts = pC->pAudioEncoderInterface[encoderType]; - pC->pCurrentAudioEncoderUserData = - pC->pAudioEncoderUserDataTable[encoderType]; - - M4OSA_TRACE3_3( - "M4VSS3GPP_setCurrentAudioEncoder: pC->pAudioEncoderInterface[0x%x]=0x%x,\ - pC->pAudioEncoderGlobalFcts = 0x%x", - encoderType, pC->pAudioEncoderInterface[encoderType], - pC->pAudioEncoderGlobalFcts); - - if( pC->pAudioEncoderGlobalFcts == M4OSA_NULL ) - { - M4OSA_DEBUG_IF1(M4OSA_TRUE, - M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT, - "Audio encoder type not supported"); - M4OSA_TRACE1_0("Audio encoder type not supported"); - return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT; - } - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_setCurrentReader() - * @brief Set current reader - * @param pContext (IN/OUT) VSS context. - * @param mediaType (IN) Media type. - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: A parameter is null (in DEBUG only) - * @return M4WAR_VSS_MEDIATYPE_NOT_SUPPORTED: Media type not supported - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_setCurrentReader( M4VSS3GPP_MediaAndCodecCtxt *pC, - M4VIDEOEDITING_FileType mediaType ) -{ - M4READER_MediaType readerType; - - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - - switch( mediaType ) - { - case M4VIDEOEDITING_kFileType_3GPP: - case M4VIDEOEDITING_kFileType_MP4: - case M4VIDEOEDITING_kFileType_M4V: - readerType = M4READER_kMediaType3GPP; - break; - - case M4VIDEOEDITING_kFileType_AMR: - readerType = M4READER_kMediaTypeAMR; - break; - - case M4VIDEOEDITING_kFileType_MP3: - readerType = M4READER_kMediaTypeMP3; - break; - - case M4VIDEOEDITING_kFileType_PCM: - readerType = M4READER_kMediaTypePCM; - break; - - default: - M4OSA_DEBUG_IF1(M4OSA_TRUE, M4VSS3GPP_ERR_INVALID_FILE_TYPE, - "Reader type not supported"); - return M4VSS3GPP_ERR_INVALID_FILE_TYPE; - } - - pC->m_pReader = pC->m_pReaderGlobalItTable[readerType]; - pC->m_pReaderDataIt = pC->m_pReaderDataItTable[readerType]; - - if( pC->m_pReader == M4OSA_NULL || pC->m_pReaderDataIt == M4OSA_NULL ) - { - M4OSA_DEBUG_IF1(M4OSA_TRUE, M4VSS3GPP_ERR_INVALID_FILE_TYPE, - "Reader type not supported"); - M4OSA_TRACE1_0("Reader type not supported"); - return M4VSS3GPP_ERR_INVALID_FILE_TYPE; - } - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_setCurrentVideoDecoder() - * @brief Set a video decoder - * @param pContext (IN/OUT) VSS context. - * @param decoderType (IN) Decoder type - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: A parameter is null (in DEBUG only) - * @return M4WAR_VSS_MEDIATYPE_NOT_SUPPORTED: Media type not supported - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_setCurrentVideoDecoder( M4VSS3GPP_MediaAndCodecCtxt *pC, - M4_StreamType mediaType ) -{ - M4DECODER_VideoType decoderType; - - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - M4OSA_TRACE3_2("M4VSS3GPP_setCurrentVideoDecoder: pC=0x%x, mediaType=0x%x", - pC, mediaType); - - switch( mediaType ) - { - case M4DA_StreamTypeVideoMpeg4: - case M4DA_StreamTypeVideoH263: - decoderType = M4DECODER_kVideoTypeMPEG4; - break; - - case M4DA_StreamTypeVideoMpeg4Avc: - decoderType = M4DECODER_kVideoTypeAVC; - break; - case M4DA_StreamTypeVideoARGB8888: - decoderType = M4DECODER_kVideoTypeYUV420P; - break; - default: - M4OSA_DEBUG_IF1(M4OSA_TRUE, - M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT, - "Video decoder type not supported"); - return M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT; - } - - pC->m_pVideoDecoder = pC->m_pVideoDecoderItTable[decoderType]; -#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS - - pC->m_pCurrentVideoDecoderUserData = - pC->m_pVideoDecoderUserDataTable[decoderType]; - -#endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */ - - if( pC->m_pVideoDecoder == M4OSA_NULL ) - { - M4OSA_DEBUG_IF1(M4OSA_TRUE, - M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT, - "Video decoder type not supported"); - M4OSA_TRACE1_0("Video decoder type not supported"); - return M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT; - } - - return M4NO_ERROR; -} - -/** - ************************************************************************ - * M4OSA_ERR M4VSS3GPP_setCurrentAudioDecoder() - * @brief Set an audio decoder - * @param context (IN/OUT) VSS context. - * @param decoderType (IN) Decoder type - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: A parameter is null (in DEBUG only) - ************************************************************************ - */ -M4OSA_ERR M4VSS3GPP_setCurrentAudioDecoder( M4VSS3GPP_MediaAndCodecCtxt *pC, - M4_StreamType mediaType ) -{ - M4AD_Type decoderType; - - M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER, - "invalid context pointer"); - M4OSA_TRACE3_2("M4VSS3GPP_setCurrentAudioDecoder: pC=0x%x, mediaType=0x%x", - pC, mediaType); - - switch( mediaType ) - { - case M4DA_StreamTypeAudioAmrNarrowBand: - decoderType = M4AD_kTypeAMRNB; - break; - - case M4DA_StreamTypeAudioAac: - case M4DA_StreamTypeAudioAacADTS: - case M4DA_StreamTypeAudioAacADIF: - decoderType = M4AD_kTypeAAC; - break; - - case M4DA_StreamTypeAudioMp3: - decoderType = M4AD_kTypeMP3; - break; - - case M4DA_StreamTypeAudioPcm: - decoderType = M4AD_kTypePCM; - break; - - default: - M4OSA_DEBUG_IF1(M4OSA_TRUE, - M4VSS3GPP_ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT, - "Audio decoder type not supported"); - return M4VSS3GPP_ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT; - } - - pC->m_pAudioDecoder = pC->m_pAudioDecoderItTable[decoderType]; - pC->pCurrentAudioDecoderUserData = - pC->pAudioDecoderUserDataTable[decoderType]; - - if( pC->m_pAudioDecoder == M4OSA_NULL ) - { - M4OSA_DEBUG_IF1(M4OSA_TRUE, - M4VSS3GPP_ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT, - "Audio decoder type not supported"); - M4OSA_TRACE1_0("Audio decoder type not supported"); - return M4VSS3GPP_ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT; - } - - return M4NO_ERROR; -} diff --git a/libvideoeditor/vss/src/M4VSS3GPP_Edit.c b/libvideoeditor/vss/src/M4VSS3GPP_Edit.c deleted file mode 100755 index df8b7d5..0000000 --- a/libvideoeditor/vss/src/M4VSS3GPP_Edit.c +++ /dev/null @@ -1,3475 +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 M4VSS3GPP_Edit.c - * @brief Video Studio Service 3GPP edit API implementation. - * @note - ****************************************************************************** - */ - -/****************/ -/*** Includes ***/ -/****************/ - -#include "NXPSW_CompilerSwitches.h" -/** - * Our headers */ -#include "M4VSS3GPP_API.h" -#include "M4VSS3GPP_InternalTypes.h" -#include "M4VSS3GPP_InternalFunctions.h" -#include "M4VSS3GPP_InternalConfig.h" -#include "M4VSS3GPP_ErrorCodes.h" - - -/** - * OSAL headers */ -#include "M4OSA_Memory.h" /**< OSAL memory management */ -#include "M4OSA_Debug.h" /**< OSAL debug management */ -#include "M4OSA_CharStar.h" /**< OSAL string management */ - -#ifdef WIN32 -#include "string.h" /**< for strcpy (Don't want to get dependencies - with M4OSA_String...) */ - -#endif /* WIN32 */ -#ifdef M4VSS_ENABLE_EXTERNAL_DECODERS -#include "M4VD_EXTERNAL_Interface.h" -#endif - -/************************************************************************/ -/* Static local functions */ -/************************************************************************/ -static M4OSA_ERR M4VSS3GPP_intClipSettingsSanityCheck( - M4VSS3GPP_ClipSettings *pClip ); -static M4OSA_ERR M4VSS3GPP_intTransitionSettingsSanityCheck( - M4VSS3GPP_TransitionSettings *pTransition ); -static M4OSA_Void M4VSS3GPP_intFreeSettingsList( - M4VSS3GPP_InternalEditContext *pC ); -static M4OSA_ERR -M4VSS3GPP_intCreateMP3OutputFile( M4VSS3GPP_InternalEditContext *pC, - M4OSA_Void *pOutputFile ); -static M4OSA_ERR M4VSS3GPP_intSwitchToNextClip( - M4VSS3GPP_InternalEditContext *pC ); -static M4OSA_ERR -M4VSS3GPP_intComputeOutputVideoAndAudioDsi( M4VSS3GPP_InternalEditContext *pC, - M4OSA_UInt8 uiMasterClip ); -static M4OSA_Void M4VSS3GPP_intComputeOutputAverageVideoBitrate( - M4VSS3GPP_InternalEditContext *pC ); - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_GetVersion() - * @brief Get the VSS 3GPP version. - * @note Can be called anytime. Do not need any context. - * @param pVersionInfo (OUT) Pointer to a version info structure - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pVersionInfo is M4OSA_NULL (If Debug Level >= 2) - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_GetVersion( M4_VersionInfo *pVersionInfo ) -{ - M4OSA_TRACE3_1("M4VSS3GPP_GetVersion called with pVersionInfo=0x%x", - pVersionInfo); - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pVersionInfo), M4ERR_PARAMETER, - "M4VSS3GPP_GetVersion: pVersionInfo is M4OSA_NULL"); - - pVersionInfo->m_major = M4VSS_VERSION_MAJOR; - pVersionInfo->m_minor = M4VSS_VERSION_MINOR; - pVersionInfo->m_revision = M4VSS_VERSION_REVISION; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_editInit() - * @brief Initializes the VSS 3GPP edit operation (allocates an execution context). - * @note - * @param pContext (OUT) Pointer on the VSS 3GPP edit context to allocate - * @param pFileReadPtrFct (IN) Pointer to OSAL file reader functions - * @param pFileWritePtrFct (IN) Pointer to OSAL file writer functions - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_ALLOC: There is no more available memory - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_editInit( M4VSS3GPP_EditContext *pContext, - M4OSA_FileReadPointer *pFileReadPtrFct, - M4OSA_FileWriterPointer *pFileWritePtrFct ) -{ - M4VSS3GPP_InternalEditContext *pC; - M4OSA_ERR err; - M4OSA_UInt32 i; - - M4OSA_TRACE3_3( - "M4VSS3GPP_editInit called with pContext=0x%x, \ - pFileReadPtrFct=0x%x, pFileWritePtrFct=0x%x", - pContext, pFileReadPtrFct, pFileWritePtrFct); - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER, - "M4VSS3GPP_editInit: pContext is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pFileReadPtrFct), M4ERR_PARAMETER, - "M4VSS3GPP_editInit: pFileReadPtrFct is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pFileWritePtrFct), M4ERR_PARAMETER, - "M4VSS3GPP_editInit: pFileWritePtrFct is M4OSA_NULL"); - - /** - * Allocate the VSS context and return it to the user */ - pC = (M4VSS3GPP_InternalEditContext - *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_InternalEditContext), - M4VSS3GPP, (M4OSA_Char *)"M4VSS3GPP_InternalContext"); - *pContext = pC; - /* Inialization of context Variables */ - memset((void *)pC, 0,sizeof(M4VSS3GPP_InternalEditContext)); - - if( M4OSA_NULL == pC ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_editInit(): unable to allocate M4VSS3GPP_InternalContext,\ - returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - - - /* Init the context. */ - pC->uiClipNumber = 0; - pC->pClipList = M4OSA_NULL; - pC->pTransitionList = M4OSA_NULL; - pC->pEffectsList = M4OSA_NULL; - pC->pActiveEffectsList = M4OSA_NULL; - pC->pActiveEffectsList1 = M4OSA_NULL; - pC->bClip1ActiveFramingEffect = M4OSA_FALSE; - pC->bClip2ActiveFramingEffect = M4OSA_FALSE; - pC->uiCurrentClip = 0; - pC->pC1 = M4OSA_NULL; - pC->pC2 = M4OSA_NULL; - pC->yuv1[0].pac_data = pC->yuv1[1].pac_data = pC-> - yuv1[2].pac_data = M4OSA_NULL; - pC->yuv2[0].pac_data = pC->yuv2[1].pac_data = pC-> - yuv2[2].pac_data = M4OSA_NULL; - pC->yuv3[0].pac_data = pC->yuv3[1].pac_data = pC-> - yuv3[2].pac_data = M4OSA_NULL; - pC->yuv4[0].pac_data = pC->yuv4[1].pac_data = pC-> - yuv4[2].pac_data = M4OSA_NULL; - pC->bClip1AtBeginCut = M4OSA_FALSE; - pC->iClip1ActiveEffect = 0; - pC->iClip2ActiveEffect = 0; - pC->bTransitionEffect = M4OSA_FALSE; - pC->bSupportSilence = M4OSA_FALSE; - - /** - * Init PC->ewc members */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - pC->ewc.dInputVidCts = 0.0; - pC->ewc.dOutputVidCts = 0.0; - pC->ewc.dATo = 0.0; - pC->ewc.iOutputDuration = 0; - pC->ewc.VideoStreamType = M4SYS_kVideoUnknown; - pC->ewc.uiVideoBitrate = 0; - pC->ewc.uiVideoWidth = 0; - pC->ewc.uiVideoHeight = 0; - pC->ewc.uiVideoTimeScale = 0; - pC->ewc.bVideoDataPartitioning = M4OSA_FALSE; - pC->ewc.pVideoOutputDsi = M4OSA_NULL; - pC->ewc.uiVideoOutputDsiSize = 0; - pC->ewc.AudioStreamType = M4SYS_kAudioUnknown; - pC->ewc.uiNbChannels = 1; - pC->ewc.uiAudioBitrate = 0; - pC->ewc.uiSamplingFrequency = 0; - pC->ewc.pAudioOutputDsi = M4OSA_NULL; - pC->ewc.uiAudioOutputDsiSize = 0; - pC->ewc.pAudioEncCtxt = M4OSA_NULL; - pC->ewc.pAudioEncDSI.infoSize = 0; - pC->ewc.pAudioEncDSI.pInfo = M4OSA_NULL; - pC->ewc.uiSilencePcmSize = 0; - pC->ewc.pSilenceFrameData = M4OSA_NULL; - pC->ewc.uiSilenceFrameSize = 0; - pC->ewc.iSilenceFrameDuration = 0; - pC->ewc.scale_audio = 0.0; - pC->ewc.pEncContext = M4OSA_NULL; - pC->ewc.pDummyAuBuffer = M4OSA_NULL; - pC->ewc.iMpeg4GovOffset = 0; - pC->ewc.VppError = 0; - pC->ewc.encoderState = M4VSS3GPP_kNoEncoder; - pC->ewc.p3gpWriterContext = M4OSA_NULL; - pC->ewc.uiVideoMaxAuSize = 0; - pC->ewc.uiAudioMaxAuSize = 0; - /** - * Keep the OSAL file functions pointer set in our context */ - pC->pOsaFileReadPtr = pFileReadPtrFct; - pC->pOsaFileWritPtr = pFileWritePtrFct; - - /* - * Reset pointers for media and codecs interfaces */ - - err = M4VSS3GPP_clearInterfaceTables(&pC->ShellAPI); - M4ERR_CHECK_RETURN(err); - - /* - * Call the media and codecs subscription module */ - err = M4VSS3GPP_subscribeMediaAndCodec(&pC->ShellAPI); - M4ERR_CHECK_RETURN(err); - - /** - * Update main state automaton */ - pC->State = M4VSS3GPP_kEditState_CREATED; - pC->Vstate = M4VSS3GPP_kEditVideoState_READ_WRITE; - pC->Astate = M4VSS3GPP_kEditAudioState_READ_WRITE; - /* The flag is set to false at the beginning of every clip */ - pC->m_bClipExternalHasStarted = M4OSA_FALSE; - - pC->bIsMMS = M4OSA_FALSE; - - pC->iInOutTimeOffset = 0; - pC->bEncodeTillEoF = M4OSA_FALSE; - pC->nbActiveEffects = 0; - pC->nbActiveEffects1 = 0; - pC->bIssecondClip = M4OSA_FALSE; - pC->m_air_context = M4OSA_NULL; - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_editInit(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_editCreateClipSettings() - * @brief Allows filling a clip settings structure with default values - * - * @note WARNING: pClipSettings->Effects[ ] will be allocated in this function. - * pClipSettings->pFile will be allocated in this function. - * - * @param pClipSettings (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure - * @param pFile (IN) Clip file name - * @param filePathSize (IN) Clip path size (needed for UTF 16 conversion) - * @param nbEffects (IN) Nb of effect settings to allocate - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pClipSettings is M4OSA_NULL (debug only) - ****************************************************************************** - */ -M4OSA_ERR -M4VSS3GPP_editCreateClipSettings( M4VSS3GPP_ClipSettings *pClipSettings, - M4OSA_Void *pFile, M4OSA_UInt32 filePathSize, - M4OSA_UInt8 nbEffects ) -{ - M4OSA_UInt8 uiFx; - - M4OSA_TRACE3_1( - "M4VSS3GPP_editCreateClipSettings called with pClipSettings=0x%p", - pClipSettings); - - /** - * Check input parameter */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettings), M4ERR_PARAMETER, - "M4VSS3GPP_editCreateClipSettings: pClipSettings is NULL"); - - /** - * Set the clip settings to default */ - pClipSettings->pFile = M4OSA_NULL; /**< no file */ - pClipSettings->FileType = - M4VIDEOEDITING_kFileType_Unsupported; /**< undefined */ - - if( M4OSA_NULL != pFile ) - { - //pClipSettings->pFile = (M4OSA_Char*) M4OSA_32bitAlignedMalloc(strlen(pFile)+1, M4VSS3GPP, - // "pClipSettings->pFile"); - /*FB: add clip path size because of utf 16 conversion*/ - pClipSettings->pFile = - (M4OSA_Void *)M4OSA_32bitAlignedMalloc(filePathSize + 1, M4VSS3GPP, - (M4OSA_Char *)"pClipSettings->pFile"); - - if( M4OSA_NULL == pClipSettings->pFile ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_editCreateClipSettings : ERROR allocating filename"); - return M4ERR_ALLOC; - } - //memcpy(pClipSettings->pFile, pFile, strlen(pFile)+1); - /*FB: add clip path size because of utf 16 conversion*/ - memcpy((void *)pClipSettings->pFile, (void *)pFile, filePathSize + 1); - } - - /*FB: add file path size to support UTF16 conversion*/ - pClipSettings->filePathSize = filePathSize + 1; - /**/ - pClipSettings->ClipProperties.bAnalysed = M4OSA_FALSE; - pClipSettings->ClipProperties.FileType = 0; - pClipSettings->ClipProperties.Version[0] = 0; - pClipSettings->ClipProperties.Version[1] = 0; - pClipSettings->ClipProperties.Version[2] = 0; - pClipSettings->ClipProperties.uiClipDuration = 0; - - pClipSettings->uiBeginCutTime = 0; /**< no begin cut */ - pClipSettings->uiEndCutTime = 0; /**< no end cut */ - pClipSettings->ClipProperties.bSetImageData = M4OSA_FALSE; - - /** - * Reset video characteristics */ - pClipSettings->ClipProperties.VideoStreamType = M4VIDEOEDITING_kNoneVideo; - pClipSettings->ClipProperties.uiClipVideoDuration = 0; - pClipSettings->ClipProperties.uiVideoBitrate = 0; - pClipSettings->ClipProperties.uiVideoMaxAuSize = 0; - pClipSettings->ClipProperties.uiVideoWidth = 0; - pClipSettings->ClipProperties.uiVideoHeight = 0; - pClipSettings->ClipProperties.uiVideoTimeScale = 0; - pClipSettings->ClipProperties.fAverageFrameRate = 0.0; - pClipSettings->ClipProperties.uiVideoProfile = - M4VIDEOEDITING_VIDEO_UNKNOWN_PROFILE; - pClipSettings->ClipProperties.uiVideoLevel = - M4VIDEOEDITING_VIDEO_UNKNOWN_LEVEL; - pClipSettings->ClipProperties.bMPEG4dataPartition = M4OSA_FALSE; - pClipSettings->ClipProperties.bMPEG4rvlc = M4OSA_FALSE; - pClipSettings->ClipProperties.bMPEG4resynchMarker = M4OSA_FALSE; - - /** - * Reset audio characteristics */ - pClipSettings->ClipProperties.AudioStreamType = M4VIDEOEDITING_kNoneAudio; - pClipSettings->ClipProperties.uiClipAudioDuration = 0; - pClipSettings->ClipProperties.uiAudioBitrate = 0; - pClipSettings->ClipProperties.uiAudioMaxAuSize = 0; - pClipSettings->ClipProperties.uiNbChannels = 0; - pClipSettings->ClipProperties.uiSamplingFrequency = 0; - pClipSettings->ClipProperties.uiExtendedSamplingFrequency = 0; - pClipSettings->ClipProperties.uiDecodedPcmSize = 0; - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_editSetDefaultSettings(): returning M4NO_ERROR"); - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_editDuplicateClipSettings() - * @brief Duplicates a clip settings structure, performing allocations if required - * - * @param pClipSettingsDest (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure - * @param pClipSettingsOrig (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure - * @param bCopyEffects (IN) Flag to know if we have to duplicate effects - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pClipSettings is M4OSA_NULL (debug only) - ****************************************************************************** - */ -M4OSA_ERR -M4VSS3GPP_editDuplicateClipSettings( M4VSS3GPP_ClipSettings *pClipSettingsDest, - M4VSS3GPP_ClipSettings *pClipSettingsOrig, - M4OSA_Bool bCopyEffects ) -{ - M4OSA_UInt8 uiFx; - - M4OSA_TRACE3_2( - "M4VSS3GPP_editDuplicateClipSettings called with dest=0x%p src=0x%p", - pClipSettingsDest, pClipSettingsOrig); - - /* Check input parameter */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettingsDest), M4ERR_PARAMETER, - "M4VSS3GPP_editDuplicateClipSettings: pClipSettingsDest is NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettingsOrig), M4ERR_PARAMETER, - "M4VSS3GPP_editDuplicateClipSettings: pClipSettingsOrig is NULL"); - - /* Copy plain structure */ - memcpy((void *)pClipSettingsDest, - (void *)pClipSettingsOrig, sizeof(M4VSS3GPP_ClipSettings)); - - /* Duplicate filename */ - if( M4OSA_NULL != pClipSettingsOrig->pFile ) - { - //pClipSettingsDest->pFile = - // (M4OSA_Char*) M4OSA_32bitAlignedMalloc(strlen(pClipSettingsOrig->pFile)+1, M4VSS3GPP, - // "pClipSettingsDest->pFile"); - /*FB: clip path size is needed for utf 16 conversion*/ - /*FB 2008/10/16: bad allocation size which raises a crash*/ - pClipSettingsDest->pFile = - (M4OSA_Char *)M4OSA_32bitAlignedMalloc(pClipSettingsOrig->filePathSize + 1, - M4VSS3GPP, (M4OSA_Char *)"pClipSettingsDest->pFile"); - - if( M4OSA_NULL == pClipSettingsDest->pFile ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_editDuplicateClipSettings : ERROR allocating filename"); - return M4ERR_ALLOC; - } - /*FB: clip path size is needed for utf 16 conversion*/ - //memcpy(pClipSettingsDest->pFile, pClipSettingsOrig->pFile, - // strlen(pClipSettingsOrig->pFile)+1); - /*FB 2008/10/16: bad allocation size which raises a crash*/ - memcpy((void *)pClipSettingsDest->pFile, (void *)pClipSettingsOrig->pFile, - pClipSettingsOrig->filePathSize/*+1*/); - ( (M4OSA_Char - *)pClipSettingsDest->pFile)[pClipSettingsOrig->filePathSize] = '\0'; - } - - /* Duplicate effects */ - /* Return with no error */ - - M4OSA_TRACE3_0( - "M4VSS3GPP_editDuplicateClipSettings(): returning M4NO_ERROR"); - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_editFreeClipSettings() - * @brief Free the pointers allocated in the ClipSetting structure (pFile, Effects). - * - * @param pClipSettings (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pClipSettings is M4OSA_NULL (debug only) - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_editFreeClipSettings( - M4VSS3GPP_ClipSettings *pClipSettings ) -{ - /** - * Check input parameter */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettings), M4ERR_PARAMETER, - "M4VSS3GPP_editFreeClipSettings: pClipSettings is NULL"); - - /* free filename */ - if( M4OSA_NULL != pClipSettings->pFile ) - { - free(pClipSettings->pFile); - pClipSettings->pFile = M4OSA_NULL; - } - - /* free effects settings */ - /* if(M4OSA_NULL != pClipSettings->Effects) - { - free(pClipSettings->Effects); - pClipSettings->Effects = M4OSA_NULL; - pClipSettings->nbEffects = 0; - } RC */ - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_editOpen() - * @brief Set the VSS input and output files. - * @note It opens the input file, but the output file may not be created yet. - * @param pContext (IN) VSS edit context - * @param pSettings (IN) Edit settings - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL (debug only) - * @return M4ERR_STATE: VSS is not in an appropriate state for this function to be called - * @return M4ERR_ALLOC: There is no more available memory - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_editOpen( M4VSS3GPP_EditContext pContext, - M4VSS3GPP_EditSettings *pSettings ) -{ - M4VSS3GPP_InternalEditContext *pC = - (M4VSS3GPP_InternalEditContext *)pContext; - - M4OSA_ERR err; - M4OSA_Int32 i; - M4VIDEOEDITING_FileType outputFileType = - M4VIDEOEDITING_kFileType_Unsupported; /**< 3GPP or MP3 (we don't do AMR output) */ - M4OSA_UInt32 uiC1duration, uiC2duration; - - M4OSA_TRACE3_2( - "M4VSS3GPP_editOpen called with pContext=0x%x, pSettings=0x%x", - pContext, pSettings); - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER, - "M4VSS3GPP_editOpen: pContext is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pSettings), M4ERR_PARAMETER, - "M4VSS3GPP_editOpen: pSettings is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pSettings->pClipList), M4ERR_PARAMETER, - "M4VSS3GPP_editOpen: pSettings->pClipList is M4OSA_NULL"); - M4OSA_DEBUG_IF2(( pSettings->uiClipNumber > 1) - && (M4OSA_NULL == pSettings->pTransitionList), M4ERR_PARAMETER, - "M4VSS3GPP_editOpen: pSettings->pTransitionList is M4OSA_NULL"); - - /** - * Check state automaton */ - if( ( pC->State != M4VSS3GPP_kEditState_CREATED) - && (pC->State != M4VSS3GPP_kEditState_CLOSED) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editOpen: State error (0x%x)! Returning M4ERR_STATE", - pC->State); - return M4ERR_STATE; - } - - /** - * Free any previously allocated internal settings list */ - M4VSS3GPP_intFreeSettingsList(pC); - - /** - * Copy the user settings in our context */ - pC->uiClipNumber = pSettings->uiClipNumber; - - /** - * Copy the clip list */ - pC->pClipList = - (M4VSS3GPP_ClipSettings *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_ClipSettings) - * pC->uiClipNumber, M4VSS3GPP, (M4OSA_Char *)"pC->pClipList"); - - if( M4OSA_NULL == pC->pClipList ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_editOpen: unable to allocate pC->Settings.pClipList,\ - returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - - for ( i = 0; i < pSettings->uiClipNumber; i++ ) - { - M4VSS3GPP_editDuplicateClipSettings(&(pC->pClipList[i]), - pSettings->pClipList[i], M4OSA_TRUE); - } - - /** - * Copy effects list RC */ - - /*FB bug fix 19.03.2008 if the number of effects is 0 -> crash*/ - if( pSettings->nbEffects > 0 ) - { - pC->nbEffects = pSettings->nbEffects; - pC->pEffectsList = (M4VSS3GPP_EffectSettings - *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_EffectSettings) * pC->nbEffects, - M4VSS3GPP, (M4OSA_Char *)"pC->pEffectsList"); - - if( M4OSA_NULL == pC->pEffectsList ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_editOpen: unable to allocate pC->pEffectsList, returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - - for ( i = 0; i < pC->nbEffects; i++ ) - { - memcpy((void *) &(pC->pEffectsList[i]), - (void *) &(pSettings->Effects[i]), - sizeof(M4VSS3GPP_EffectSettings)); - } - - /** - * Allocate active effects list RC */ - pC->pActiveEffectsList = - (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc(sizeof(M4OSA_UInt8) * pC->nbEffects, - M4VSS3GPP, (M4OSA_Char *)"pC->pActiveEffectsList"); - - if( M4OSA_NULL == pC->pActiveEffectsList ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_editOpen: unable to allocate pC->pActiveEffectsList,\ - returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - /** - * Allocate active effects list */ - pC->pActiveEffectsList1 = - (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc(sizeof(M4OSA_UInt8) * pC->nbEffects, - M4VSS3GPP, (M4OSA_Char *)"pC->pActiveEffectsList"); - if (M4OSA_NULL == pC->pActiveEffectsList1) - { - M4OSA_TRACE1_0("M4VSS3GPP_editOpen: unable to allocate pC->pActiveEffectsList, \ - returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - - } - else - { - pC->nbEffects = 0; - pC->nbActiveEffects = 0; - pC->nbActiveEffects1 = 0; - pC->pEffectsList = M4OSA_NULL; - pC->pActiveEffectsList = M4OSA_NULL; - pC->pActiveEffectsList1 = M4OSA_NULL; - pC->bClip1ActiveFramingEffect = M4OSA_FALSE; - pC->bClip2ActiveFramingEffect = M4OSA_FALSE; - } - - /** - * Test the clip analysis data, if it is not provided, analyse the clips by ourselves. */ - for ( i = 0; i < pC->uiClipNumber; i++ ) - { - if( M4OSA_FALSE == pC->pClipList[i].ClipProperties.bAnalysed ) - { - /**< Analysis not provided by the integrator */ - err = M4VSS3GPP_editAnalyseClip(pC->pClipList[i].pFile, - pC->pClipList[i].FileType, &pC->pClipList[i].ClipProperties, - pC->pOsaFileReadPtr); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editOpen: M4VSS3GPP_editAnalyseClip returns 0x%x!", - err); - return err; - } - } - } - - /** - * Check clip compatibility */ - for ( i = 0; i < pC->uiClipNumber; i++ ) - { - if (pC->pClipList[i].FileType !=M4VIDEOEDITING_kFileType_ARGB8888) { - /** - * Check all the clips are compatible with VSS 3GPP */ - err = M4VSS3GPP_intCheckClipCompatibleWithVssEditing( - &pC->pClipList[i].ClipProperties); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_2( - "M4VSS3GPP_editOpen:\ - M4VSS3GPP_intCheckClipCompatibleWithVssEditing(%d) returns 0x%x!", - i, err); - return err; - } - } - - /** - * Check the master clip versus all the other ones. - (including master clip with itself, else variables for master clip - are not properly setted) */ - if(pC->pClipList[i].FileType != M4VIDEOEDITING_kFileType_ARGB8888) { - - err = M4VSS3GPP_editCheckClipCompatibility( - &pC->pClipList[pSettings->uiMasterClip].ClipProperties, - &pC->pClipList[i].ClipProperties); - /* in case of warning regarding audio incompatibility, - editing continues */ - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_2( - "M4VSS3GPP_editOpen: M4VSS3GPP_editCheckClipCompatibility \ - (%d) returns 0x%x!", i, err); - return err; - } - } else { - pC->pClipList[i].ClipProperties.bAudioIsCompatibleWithMasterClip = - M4OSA_FALSE; - } - } - /* Search audio tracks that cannot be edited : - * - delete all audio effects for the clip - * - if master clip is editable let the transition - (bad track will be replaced later with silence) - * - if master clip is not editable switch to a dummy transition (only copy/paste) */ - for ( i = 0; i < pC->uiClipNumber; i++ ) - { - if( M4OSA_FALSE == pC->pClipList[i].ClipProperties.bAudioIsEditable ) - { - M4OSA_UInt8 uiFx; - - for ( uiFx = 0; uiFx < pC->nbEffects; uiFx++ ) - { - pC->pEffectsList[uiFx].AudioEffectType - = M4VSS3GPP_kAudioEffectType_None; - } - - if( ( i < (pC->uiClipNumber - 1)) - && (M4OSA_NULL != pSettings->pTransitionList[i]) - && (M4OSA_FALSE == pC->pClipList[pSettings-> - uiMasterClip].ClipProperties.bAudioIsEditable) ) - { - pSettings->pTransitionList[i]->AudioTransitionType - = M4VSS3GPP_kAudioTransitionType_None; - } - } - } - - /** - * We add a transition of duration 0 at the end of the last clip. - * It will suppress a whole bunch a test latter in the processing... */ - pC->pTransitionList = (M4VSS3GPP_TransitionSettings - *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_TransitionSettings) - * (pC->uiClipNumber), M4VSS3GPP, (M4OSA_Char *)"pC->pTransitionList"); - - if( M4OSA_NULL == pC->pTransitionList ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_editOpen: unable to allocate pC->Settings.pTransitionList,\ - returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - - /**< copy transition settings */ - for ( i = 0; i < (pSettings->uiClipNumber - 1); i++ ) - { - memcpy((void *) &(pC->pTransitionList[i]), - (void *)pSettings->pTransitionList[i], - sizeof(M4VSS3GPP_TransitionSettings)); - } - - /**< We fill the last "dummy" transition */ - pC->pTransitionList[pC->uiClipNumber - 1].uiTransitionDuration = 0; - pC->pTransitionList[pC->uiClipNumber - - 1].VideoTransitionType = M4VSS3GPP_kVideoTransitionType_None; - pC->pTransitionList[pC->uiClipNumber - - 1].AudioTransitionType = M4VSS3GPP_kAudioTransitionType_None; - - /** - * Avoid weird clip settings */ - for ( i = 0; i < pSettings->uiClipNumber; i++ ) - { - if (pC->pClipList[i].FileType !=M4VIDEOEDITING_kFileType_ARGB8888) { - err = M4VSS3GPP_intClipSettingsSanityCheck(&pC->pClipList[i]); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editOpen: M4VSS3GPP_intClipSettingsSanityCheck returns 0x%x!", - err); - return err; - } - } - } - - for ( i = 0; i < (pSettings->uiClipNumber - 1); i++ ) - { - if (pC->pTransitionList[i].uiTransitionDuration != 0) { - if (pC->pClipList[i].FileType == M4VIDEOEDITING_kFileType_ARGB8888) { - pC->pClipList[i].uiBeginCutTime = 0; - pC->pClipList[i].uiEndCutTime = - pC->pTransitionList[i].uiTransitionDuration; - } - - if (pC->pClipList[i+1].FileType == M4VIDEOEDITING_kFileType_ARGB8888) { - pC->pClipList[i+1].uiBeginCutTime = 0; - pC->pClipList[i+1].uiEndCutTime = - pC->pTransitionList[i].uiTransitionDuration; - } - } else { - - if (pC->pClipList[i].FileType == M4VIDEOEDITING_kFileType_ARGB8888) { - pC->pClipList[i].uiEndCutTime = - pC->pClipList[i].uiEndCutTime - pC->pClipList[i].uiBeginCutTime; - pC->pClipList[i].uiBeginCutTime = 0; - } - - if (pC->pClipList[i+1].FileType == M4VIDEOEDITING_kFileType_ARGB8888) { - pC->pClipList[i+1].uiEndCutTime = - pC->pClipList[i+1].uiEndCutTime - pC->pClipList[i+1].uiBeginCutTime; - pC->pClipList[i+1].uiBeginCutTime = 0; - } - - } - - /** - * Maximum transition duration between clip n and clip n+1 is the duration - * of the shortest clip */ - if( 0 == pC->pClipList[i].uiEndCutTime ) - { - uiC1duration = pC->pClipList[i].ClipProperties.uiClipVideoDuration; - } - else - { - /**< duration of clip n is the end cut time */ - uiC1duration = pC->pClipList[i].uiEndCutTime; - } - - /**< Substract begin cut */ - uiC1duration -= pC->pClipList[i].uiBeginCutTime; - - /**< Check that the transition is shorter than clip n */ - if( pC->pTransitionList[i].uiTransitionDuration > uiC1duration ) - { - pC->pTransitionList[i].uiTransitionDuration = uiC1duration - 1; - } - - if( 0 == pC->pClipList[i + 1].uiEndCutTime ) - { - uiC2duration = - pC->pClipList[i + 1].ClipProperties.uiClipVideoDuration; - } - else - { - /**< duration of clip n+1 is the end cut time */ - uiC2duration = pC->pClipList[i + 1].uiEndCutTime; - } - - /**< Substract begin cut */ - uiC2duration -= pC->pClipList[i + 1].uiBeginCutTime; - - /**< Check that the transition is shorter than clip n+1 */ - if( pC->pTransitionList[i].uiTransitionDuration > uiC2duration ) - { - pC->pTransitionList[i].uiTransitionDuration = uiC2duration - 1; - } - - /** - * Avoid weird transition settings */ - err = - M4VSS3GPP_intTransitionSettingsSanityCheck(&pC->pTransitionList[i]); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editOpen: M4VSS3GPP_intClipSettingsSanityCheck returns 0x%x!", - err); - return err; - } - - /** - * Check that two transitions are not overlapping - (no overlapping possible for first clip) */ - if( i > 0 ) - { - /** - * There is a transition overlap if the sum of the duration of - two consecutive transitions - * is higher than the duration of the clip in-between. */ - if( ( pC->pTransitionList[i - 1].uiTransitionDuration - + pC->pTransitionList[i].uiTransitionDuration) >= uiC1duration ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editOpen: Overlapping transitions on clip %d,\ - returning M4VSS3GPP_ERR_OVERLAPPING_TRANSITIONS", - i); - return M4VSS3GPP_ERR_OVERLAPPING_TRANSITIONS; - } - } - } - - /** - * Output clip duration */ - for ( i = 0; i < pC->uiClipNumber; i++ ) - { - /** - * Compute the sum of the clip duration */ - if( 0 == pC->pClipList[i].uiEndCutTime ) - { - pC->ewc.iOutputDuration += - pC-> - pClipList[ - i].ClipProperties. - uiClipVideoDuration; /* Only video track duration is important to - avoid deviation if audio track is longer */ - } - else - { - pC->ewc.iOutputDuration += - pC->pClipList[i].uiEndCutTime; /**< Add end cut */ - } - - pC->ewc.iOutputDuration -= - pC->pClipList[i].uiBeginCutTime; /**< Remove begin cut */ - - /** - * Remove the duration of the transition (it is counted twice) */ - pC->ewc.iOutputDuration -= pC->pTransitionList[i].uiTransitionDuration; - } - - /* Get video properties from output properties */ - - /* Get output width and height */ - switch(pC->xVSS.outputVideoSize) { - case M4VIDEOEDITING_kSQCIF: - pC->ewc.uiVideoWidth = 128; - pC->ewc.uiVideoHeight = 96; - break; - case M4VIDEOEDITING_kQQVGA: - pC->ewc.uiVideoWidth = 160; - pC->ewc.uiVideoHeight = 120; - break; - case M4VIDEOEDITING_kQCIF: - pC->ewc.uiVideoWidth = 176; - pC->ewc.uiVideoHeight = 144; - break; - case M4VIDEOEDITING_kQVGA: - pC->ewc.uiVideoWidth = 320; - pC->ewc.uiVideoHeight = 240; - break; - case M4VIDEOEDITING_kCIF: - pC->ewc.uiVideoWidth = 352; - pC->ewc.uiVideoHeight = 288; - break; - case M4VIDEOEDITING_kVGA: - pC->ewc.uiVideoWidth = 640; - pC->ewc.uiVideoHeight = 480; - break; - /* +PR LV5807 */ - case M4VIDEOEDITING_kWVGA: - pC->ewc.uiVideoWidth = 800; - pC->ewc.uiVideoHeight = 480; - break; - case M4VIDEOEDITING_kNTSC: - pC->ewc.uiVideoWidth = 720; - pC->ewc.uiVideoHeight = 480; - break; - /* -PR LV5807 */ - /* +CR Google */ - case M4VIDEOEDITING_k640_360: - pC->ewc.uiVideoWidth = 640; - pC->ewc.uiVideoHeight = 360; - break; - - case M4VIDEOEDITING_k854_480: - pC->ewc.uiVideoWidth = M4ENCODER_854_480_Width; - pC->ewc.uiVideoHeight = 480; - break; - - case M4VIDEOEDITING_k1280_720: - pC->ewc.uiVideoWidth = 1280; - pC->ewc.uiVideoHeight = 720; - break; - case M4VIDEOEDITING_k1080_720: - pC->ewc.uiVideoWidth = M4ENCODER_1080_720_Width; - - pC->ewc.uiVideoHeight = 720; - break; - case M4VIDEOEDITING_k960_720: - pC->ewc.uiVideoWidth = 960; - pC->ewc.uiVideoHeight = 720; - break; - case M4VIDEOEDITING_k1920_1080: - pC->ewc.uiVideoWidth = 1920; - pC->ewc.uiVideoHeight = 1088; // need to be multiples of 16 - break; - - default: /* If output video size is not given, we take QCIF size */ - M4OSA_TRACE1_0( - "M4VSS3GPP_editOpen: no output video size given, default to QCIF!"); - pC->ewc.uiVideoWidth = 176; - pC->ewc.uiVideoHeight = 144; - pC->xVSS.outputVideoSize = M4VIDEOEDITING_kQCIF; - break; - } - - pC->ewc.uiVideoTimeScale = 30; - pC->ewc.bVideoDataPartitioning = 0; - /* Set output video profile and level */ - pC->ewc.outputVideoProfile = pC->xVSS.outputVideoProfile; - pC->ewc.outputVideoLevel = pC->xVSS.outputVideoLevel; - - switch(pC->xVSS.outputVideoFormat) { - case M4VIDEOEDITING_kH263: - pC->ewc.VideoStreamType = M4SYS_kH263; - break; - case M4VIDEOEDITING_kMPEG4: - pC->ewc.VideoStreamType = M4SYS_kMPEG_4; - break; - case M4VIDEOEDITING_kH264: - pC->ewc.VideoStreamType = M4SYS_kH264; - break; - default: - pC->ewc.VideoStreamType = M4SYS_kVideoUnknown; - break; - } - - /** - * Copy the audio properties of the master clip to the output properties */ - pC->ewc.uiNbChannels = - pC->pClipList[pSettings->uiMasterClip].ClipProperties.uiNbChannels; - pC->ewc.uiAudioBitrate = - pC->pClipList[pSettings->uiMasterClip].ClipProperties.uiAudioBitrate; - pC->ewc.uiSamplingFrequency = pC->pClipList[pSettings-> - uiMasterClip].ClipProperties.uiSamplingFrequency; - pC->ewc.uiSilencePcmSize = - pC->pClipList[pSettings->uiMasterClip].ClipProperties.uiDecodedPcmSize; - pC->ewc.scale_audio = pC->ewc.uiSamplingFrequency / 1000.0; - - switch( pC->pClipList[pSettings->uiMasterClip].ClipProperties.AudioStreamType ) - { - case M4VIDEOEDITING_kAMR_NB: - pC->ewc.AudioStreamType = M4SYS_kAMR; - pC->ewc.pSilenceFrameData = - (M4OSA_UInt8 *)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE; - pC->ewc.iSilenceFrameDuration = - M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_DURATION; - pC->bSupportSilence = M4OSA_TRUE; - break; - - case M4VIDEOEDITING_kAAC: - case M4VIDEOEDITING_kAACplus: - case M4VIDEOEDITING_keAACplus: - pC->ewc.AudioStreamType = M4SYS_kAAC; - - if( pC->ewc.uiNbChannels == 1 ) - { - pC->ewc.pSilenceFrameData = - (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_MONO; - pC->ewc.uiSilenceFrameSize = M4VSS3GPP_AAC_AU_SILENCE_MONO_SIZE; - pC->bSupportSilence = M4OSA_TRUE; - } - else - { - pC->ewc.pSilenceFrameData = - (M4OSA_UInt8 *)M4VSS3GPP_AAC_AU_SILENCE_STEREO; - pC->ewc.uiSilenceFrameSize = - M4VSS3GPP_AAC_AU_SILENCE_STEREO_SIZE; - pC->bSupportSilence = M4OSA_TRUE; - } - pC->ewc.iSilenceFrameDuration = - 1024; /* AAC is always 1024/Freq sample duration */ - break; - - case M4VIDEOEDITING_kMP3: - pC->ewc.AudioStreamType = M4SYS_kMP3; - pC->ewc.pSilenceFrameData = M4OSA_NULL; - pC->ewc.uiSilenceFrameSize = 0; - pC->ewc.iSilenceFrameDuration = 0; - /* Special case, mp3 core reader return a time in ms */ - pC->ewc.scale_audio = 1.0; - break; - - case M4VIDEOEDITING_kEVRC: - pC->ewc.AudioStreamType = M4SYS_kEVRC; - pC->ewc.pSilenceFrameData = M4OSA_NULL; - pC->ewc.uiSilenceFrameSize = 0; - pC->ewc.iSilenceFrameDuration = 160; /* EVRC frames are 20 ms at 8000 Hz - (makes it easier to factorize amr and evrc code) */ - break; - - default: - pC->ewc.AudioStreamType = M4SYS_kAudioUnknown; - break; - } - - for (i=0; i<pC->uiClipNumber; i++) { - if (pC->pClipList[i].bTranscodingRequired == M4OSA_FALSE) { - /** If not transcoded in Analysis phase, check - * if transcoding required now - */ - if ((pC->pClipList[i].ClipProperties.VideoStreamType != - pC->xVSS.outputVideoFormat)|| - (pC->pClipList[i].ClipProperties.uiVideoWidth != - pC->ewc.uiVideoWidth) || - (pC->pClipList[i].ClipProperties.uiVideoHeight != - pC->ewc.uiVideoHeight) || - (pC->pClipList[i].ClipProperties.VideoStreamType == - M4VIDEOEDITING_kH264) || - (pC->pClipList[i].ClipProperties.VideoStreamType == - M4VIDEOEDITING_kMPEG4 && - pC->pClipList[i].ClipProperties.uiVideoTimeScale != - pC->ewc.uiVideoTimeScale)) { - pC->pClipList[i].bTranscodingRequired = M4OSA_TRUE; - } - } else { - /** If bTranscodingRequired is true, it means the clip has - * been transcoded in Analysis phase. - */ - pC->pClipList[i].bTranscodingRequired = M4OSA_FALSE; - } - } - /** - * We produce a 3gpp file, unless it is mp3 */ - if( M4VIDEOEDITING_kMP3 == pC-> - pClipList[pSettings->uiMasterClip].ClipProperties.AudioStreamType ) - outputFileType = M4VIDEOEDITING_kFileType_MP3; - else - outputFileType = M4VIDEOEDITING_kFileType_3GPP; - - /** - * Beware, a null duration would lead to a divide by zero error (better safe than sorry...) */ - if( 0 == pC->ewc.iOutputDuration ) - { - pC->ewc.iOutputDuration = 1; - } - - /** - * Open first clip */ - pC->uiCurrentClip = 0; - - // Decorrelate input and output encoding timestamp to handle encoder prefetch - pC->ewc.dInputVidCts = 0.0; - pC->ewc.dOutputVidCts = 0.0; - pC->ewc.dATo = 0.0; - - err = M4VSS3GPP_intSwitchToNextClip(pC); - /* RC: to know when a file has been processed */ - if( M4NO_ERROR != err && err != M4VSS3GPP_WAR_SWITCH_CLIP ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editOpen: M4VSS3GPP_intSwitchToNextClip() returns 0x%x!", - err); - return err; - } - - /** - * Do the video stuff in 3GPP Audio/Video case */ - if( M4VIDEOEDITING_kFileType_3GPP == outputFileType ) - { - /** - * Compute the Decoder Specific Info for the output video and audio streams */ - err = M4VSS3GPP_intComputeOutputVideoAndAudioDsi(pC, - pSettings->uiMasterClip); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editOpen: M4VSS3GPP_intComputeOutputVideoAndAudioDsi() returns 0x%x!", - err); - return err; - } - - /** - * Compute the time increment for the transition file */ - switch( pSettings->videoFrameRate ) - { - case M4VIDEOEDITING_k5_FPS: - pC->dOutputFrameDuration = 1000.0 / 5.0; - break; - - case M4VIDEOEDITING_k7_5_FPS: - pC->dOutputFrameDuration = 1000.0 / 7.5; - break; - - case M4VIDEOEDITING_k10_FPS: - pC->dOutputFrameDuration = 1000.0 / 10.0; - break; - - case M4VIDEOEDITING_k12_5_FPS: - pC->dOutputFrameDuration = 1000.0 / 12.5; - break; - - case M4VIDEOEDITING_k15_FPS: - pC->dOutputFrameDuration = 1000.0 / 15.0; - break; - - case M4VIDEOEDITING_k20_FPS: - pC->dOutputFrameDuration = 1000.0 / 20.0; - break; - - case M4VIDEOEDITING_k25_FPS: - pC->dOutputFrameDuration = 1000.0 / 25.0; - break; - - case M4VIDEOEDITING_k30_FPS: - pC->dOutputFrameDuration = 1000.0 / 30.0; - break; - - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_editOpen(): invalid videoFrameRate (0x%x),\ - returning M4VSS3GPP_ERR_INVALID_VIDEO_ENCODING_FRAME_RATE", - pSettings->videoFrameRate); - return M4VSS3GPP_ERR_INVALID_VIDEO_ENCODING_FRAME_RATE; - } - - if( M4SYS_kMPEG_4 == pC->ewc.VideoStreamType ) - { - M4OSA_UInt32 uiAlpha; - /** - * MPEG-4 case. - * Time scale of the transition encoder must be the same than the - * timescale of the input files. - * So the frame duration must be compatible with this time scale, - * but without beeing too short. - * For that, we must compute alpha (integer) so that: - * (alpha x 1000)/EncoderTimeScale > MinFrameDuration - **/ - - uiAlpha = (M4OSA_UInt32)(( pC->dOutputFrameDuration - * pC->ewc.uiVideoTimeScale) / 1000.0 + 0.5); - - if( uiAlpha > 0 ) - { - pC->dOutputFrameDuration = - ( uiAlpha * 1000.0) / pC->ewc.uiVideoTimeScale; - } - } - else if( M4SYS_kH263 == pC->ewc.VideoStreamType ) - { - switch( pSettings->videoFrameRate ) - { - case M4VIDEOEDITING_k12_5_FPS: - case M4VIDEOEDITING_k20_FPS: - case M4VIDEOEDITING_k25_FPS: - M4OSA_TRACE1_0( - "M4VSS3GPP_editOpen(): invalid videoFrameRate for H263,\ - returning M4VSS3GPP_ERR_INVALID_VIDEO_ENCODING_FRAME_RATE"); - return M4VSS3GPP_ERR_INVALID_VIDEO_ENCODING_FRAME_RATE; - default: - break; - } - } - } - - /** - * Create the MP3 output file */ - if( M4VIDEOEDITING_kFileType_MP3 == outputFileType ) - { - M4READER_Buffer mp3tagBuffer; - err = M4VSS3GPP_intCreateMP3OutputFile(pC, pSettings->pOutputFile); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editOpen: M4VSS3GPP_intCreateMP3OutputFile returns 0x%x", - err); - return err; - } - - /* The ID3v2 tag could be at any place in the mp3 file */ - /* The mp3 reader only checks few bytes in the beginning of - stream to look for a ID3v2 tag */ - /* It means that if the ID3v2 tag is not at the beginning of the file the reader do - as there is no these metadata */ - - /* Retrieve the data of the ID3v2 Tag */ - err = pC->pC1->ShellAPI.m_pReader->m_pFctGetOption( - pC->pC1->pReaderContext, M4READER_kOptionID_Mp3Id3v2Tag, - (M4OSA_DataOption) &mp3tagBuffer); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1("M4VSS3GPP_editOpen: M4MP3R_getOption returns 0x%x", - err); - return err; - } - - /* Write the data of the ID3v2 Tag in the output file */ - if( 0 != mp3tagBuffer.m_uiBufferSize ) - { - err = pC->pOsaFileWritPtr->writeData(pC->ewc.p3gpWriterContext, - (M4OSA_MemAddr8)mp3tagBuffer.m_pData, mp3tagBuffer.m_uiBufferSize); - - /** - * Free before the error checking anyway */ - free(mp3tagBuffer.m_pData); - - /** - * Error checking */ - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editOpen: WriteData(ID3v2Tag) returns 0x%x", - err); - return err; - } - - mp3tagBuffer.m_uiBufferSize = 0; - mp3tagBuffer.m_pData = M4OSA_NULL; - } - } - /** - * Create the 3GPP output file */ - else if( M4VIDEOEDITING_kFileType_3GPP == outputFileType ) - { - pC->ewc.uiVideoBitrate = pSettings->xVSS.outputVideoBitrate; - - /** - * 11/12/2008 CR3283 MMS use case in VideoArtist: Set max output file size if needed */ - if( pC->bIsMMS == M4OSA_TRUE ) - { - err = M4VSS3GPP_intCreate3GPPOutputFile(&pC->ewc, &pC->ShellAPI, - pC->pOsaFileWritPtr, pSettings->pOutputFile, - pC->pOsaFileReadPtr, pSettings->pTemporaryFile, - pSettings->xVSS.outputFileSize); - } - else - { - err = M4VSS3GPP_intCreate3GPPOutputFile(&pC->ewc, &pC->ShellAPI, - pC->pOsaFileWritPtr, pSettings->pOutputFile, - pC->pOsaFileReadPtr, pSettings->pTemporaryFile, 0); - } - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editOpen: M4VSS3GPP_intCreate3GPPOutputFile returns 0x%x", - err); - return err; - } - } - /** - * Default error case */ - else - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editOpen: invalid outputFileType = 0x%x,\ - returning M4VSS3GPP_ERR_OUTPUT_FILE_TYPE_ERROR", - outputFileType); - return - M4VSS3GPP_ERR_OUTPUT_FILE_TYPE_ERROR; /**< this is an internal error code - unknown to the user */ - } - - /** - * Initialize state */ - if( M4SYS_kMP3 == pC->ewc.AudioStreamType ) - { - /** - * In the MP3 case we use a special audio state */ - pC->State = M4VSS3GPP_kEditState_MP3_JUMP; - } - else - { - /** - * We start with the video processing */ - pC->State = M4VSS3GPP_kEditState_VIDEO; - } - - /** - * Initialize state. - * The first clip is independant to the "virtual previous clips", - * so it's like if we where in Read/Write mode before it. */ - pC->Vstate = M4VSS3GPP_kEditVideoState_READ_WRITE; - pC->Astate = M4VSS3GPP_kEditAudioState_READ_WRITE; - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_editOpen(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_editStep() - * @brief Perform one step of editing. - * @note - * @param pContext (IN) VSS 3GPP edit context - * @param pProgress (OUT) Progress percentage (0 to 100) of the editing operation - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only) - * @return M4ERR_STATE: VSS 3GPP is not in an appropriate state for this - * function to be called - * @return M4VSS3GPP_WAR_EDITING_DONE: Edition is done, user should now call - * M4VSS3GPP_editClose() - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_editStep( M4VSS3GPP_EditContext pContext, - M4OSA_UInt8 *pProgress ) -{ - M4VSS3GPP_InternalEditContext *pC = - (M4VSS3GPP_InternalEditContext *)pContext; - M4OSA_UInt32 uiProgressAudio, uiProgressVideo, uiProgress; - M4OSA_ERR err; - - M4OSA_TRACE3_1("M4VSS3GPP_editStep called with pContext=0x%x", pContext); - - /** - * Check input parameter */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER, - "M4VSS3GPP_editStep: pContext is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pProgress), M4ERR_PARAMETER, - "M4VSS3GPP_editStep: pProgress is M4OSA_NULL"); - - /** - * Check state automaton and select correct processing */ - switch( pC->State ) - { - case M4VSS3GPP_kEditState_VIDEO: - err = M4VSS3GPP_intEditStepVideo(pC); - break; - - case M4VSS3GPP_kEditState_AUDIO: - err = M4VSS3GPP_intEditStepAudio(pC); - break; - - case M4VSS3GPP_kEditState_MP3: - err = M4VSS3GPP_intEditStepMP3(pC); - break; - - case M4VSS3GPP_kEditState_MP3_JUMP: - err = M4VSS3GPP_intEditJumpMP3(pC); - break; - - default: - M4OSA_TRACE1_0( - "M4VSS3GPP_editStep(): invalid internal state (0x%x), returning M4ERR_STATE"); - return M4ERR_STATE; - } - - /** - * Compute progress. - * We do the computing with 32bits precision because in some (very) extreme case, we may get - * values higher than 256 (...) */ - uiProgressAudio = - ( (M4OSA_UInt32)(pC->ewc.dATo * 100)) / pC->ewc.iOutputDuration; - // Decorrelate input and output encoding timestamp to handle encoder prefetch - uiProgressVideo = ((M4OSA_UInt32)(pC->ewc.dInputVidCts * 100)) / pC->ewc.iOutputDuration; - - uiProgress = uiProgressAudio + uiProgressVideo; - - if( ( pC->ewc.AudioStreamType != M4SYS_kAudioUnknown) - && (pC->ewc.VideoStreamType != M4SYS_kVideoUnknown) ) - uiProgress /= 2; - - /** - * Sanity check */ - if( uiProgress > 100 ) - { - *pProgress = 100; - } - else - { - *pProgress = (M4OSA_UInt8)uiProgress; - } - - /** - * Return the error */ - M4OSA_TRACE3_1("M4VSS3GPP_editStep(): returning 0x%x", err); - return err; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_editClose() - * @brief Finish the VSS edit operation. - * @note The output 3GPP file is ready to be played after this call - * @param pContext (IN) VSS edit context - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only) - * @return M4ERR_STATE: VSS is not in an appropriate state for this function to be called - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_editClose( M4VSS3GPP_EditContext pContext ) -{ - M4VSS3GPP_InternalEditContext *pC = - (M4VSS3GPP_InternalEditContext *)pContext; - M4OSA_ERR err; - M4OSA_ERR returnedError = M4NO_ERROR; - M4OSA_UInt32 lastCTS; - - M4OSA_TRACE3_1("M4VSS3GPP_editClose called with pContext=0x%x", pContext); - - /** - * Check input parameter */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER, - "M4VSS3GPP_editClose: pContext is M4OSA_NULL"); - - /** - * Check state automaton. - * In "theory", we should not authorize closing if we are in CREATED state. - * But in practice, in case the opening failed, it may have been partially done. - * In that case we have to free some opened ressources by calling Close. */ - if( M4VSS3GPP_kEditState_CLOSED == pC->State ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editClose: Wrong state (0x%x), returning M4ERR_STATE", - pC->State); - return M4ERR_STATE; - } - - /** - * There may be an encoder to destroy */ - err = M4VSS3GPP_intDestroyVideoEncoder(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editClose: M4VSS3GPP_editDestroyVideoEncoder() returns 0x%x!", - err); - /**< We do not return the error here because we still have stuff to free */ - returnedError = err; - } - - /** - * Close the output file */ - if( M4SYS_kMP3 == pC->ewc.AudioStreamType ) - { - /** - * MP3 case */ - if( M4OSA_NULL != pC->ewc.p3gpWriterContext ) - { - err = pC->pOsaFileWritPtr->closeWrite(pC->ewc.p3gpWriterContext); - pC->ewc.p3gpWriterContext = M4OSA_NULL; - } - } - else - { - /** - * Close the output 3GPP clip, if it has been opened */ - if( M4OSA_NULL != pC->ewc.p3gpWriterContext ) - { - /* Update last Video CTS */ - lastCTS = pC->ewc.iOutputDuration; - - err = pC->ShellAPI.pWriterGlobalFcts->pFctSetOption( - pC->ewc.p3gpWriterContext, - (M4OSA_UInt32)M4WRITER_kMaxFileDuration, &lastCTS); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editClose: SetOption(M4WRITER_kMaxFileDuration) returns 0x%x", - err); - } - - err = pC->ShellAPI.pWriterGlobalFcts->pFctCloseWrite( - pC->ewc.p3gpWriterContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editClose: pFctCloseWrite(OUT) returns 0x%x!", - err); - /**< We do not return the error here because we still have stuff to free */ - if( M4NO_ERROR - == returnedError ) /**< we return the first error that happened */ - { - returnedError = err; - } - } - pC->ewc.p3gpWriterContext = M4OSA_NULL; - } - } - - /** - * Free the output video DSI, if it has been created */ - if( M4OSA_NULL != pC->ewc.pVideoOutputDsi ) - { - free(pC->ewc.pVideoOutputDsi); - pC->ewc.pVideoOutputDsi = M4OSA_NULL; - } - - /** - * Free the output audio DSI, if it has been created */ - if( M4OSA_NULL != pC->ewc.pAudioOutputDsi ) - { - free(pC->ewc.pAudioOutputDsi); - pC->ewc.pAudioOutputDsi = M4OSA_NULL; - } - - /** - * Close clip1, if needed */ - if( M4OSA_NULL != pC->pC1 ) - { - err = M4VSS3GPP_intClipCleanUp(pC->pC1); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editClose: M4VSS3GPP_intClipCleanUp(C1) returns 0x%x!", - err); - /**< We do not return the error here because we still have stuff to free */ - if( M4NO_ERROR - == returnedError ) /**< we return the first error that happened */ - { - returnedError = err; - } - } - pC->pC1 = M4OSA_NULL; - } - - /** - * Close clip2, if needed */ - if( M4OSA_NULL != pC->pC2 ) - { - err = M4VSS3GPP_intClipCleanUp(pC->pC2); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editClose: M4VSS3GPP_intClipCleanUp(C2) returns 0x%x!", - err); - /**< We do not return the error here because we still have stuff to free */ - if( M4NO_ERROR - == returnedError ) /**< we return the first error that happened */ - { - returnedError = err; - } - } - pC->pC2 = M4OSA_NULL; - } - - /** - * Free the temporary YUV planes */ - if( M4OSA_NULL != pC->yuv1[0].pac_data ) - { - free(pC->yuv1[0].pac_data); - pC->yuv1[0].pac_data = M4OSA_NULL; - } - - if( M4OSA_NULL != pC->yuv1[1].pac_data ) - { - free(pC->yuv1[1].pac_data); - pC->yuv1[1].pac_data = M4OSA_NULL; - } - - if( M4OSA_NULL != pC->yuv1[2].pac_data ) - { - free(pC->yuv1[2].pac_data); - pC->yuv1[2].pac_data = M4OSA_NULL; - } - - if( M4OSA_NULL != pC->yuv2[0].pac_data ) - { - free(pC->yuv2[0].pac_data); - pC->yuv2[0].pac_data = M4OSA_NULL; - } - - if( M4OSA_NULL != pC->yuv2[1].pac_data ) - { - free(pC->yuv2[1].pac_data); - pC->yuv2[1].pac_data = M4OSA_NULL; - } - - if( M4OSA_NULL != pC->yuv2[2].pac_data ) - { - free(pC->yuv2[2].pac_data); - pC->yuv2[2].pac_data = M4OSA_NULL; - } - - /* RC */ - if( M4OSA_NULL != pC->yuv3[0].pac_data ) - { - free(pC->yuv3[0].pac_data); - pC->yuv3[0].pac_data = M4OSA_NULL; - } - - if( M4OSA_NULL != pC->yuv3[1].pac_data ) - { - free(pC->yuv3[1].pac_data); - pC->yuv3[1].pac_data = M4OSA_NULL; - } - - if( M4OSA_NULL != pC->yuv3[2].pac_data ) - { - free(pC->yuv3[2].pac_data); - pC->yuv3[2].pac_data = M4OSA_NULL; - } - - /* RC */ - if( M4OSA_NULL != pC->yuv4[0].pac_data ) - { - free(pC->yuv4[0].pac_data); - pC->yuv4[0].pac_data = M4OSA_NULL; - } - - if( M4OSA_NULL != pC->yuv4[1].pac_data ) - { - free(pC->yuv4[1].pac_data); - pC->yuv4[1].pac_data = M4OSA_NULL; - } - - if( M4OSA_NULL != pC->yuv4[2].pac_data ) - { - free(pC->yuv4[2].pac_data); - pC->yuv4[2].pac_data = M4OSA_NULL; - } - - /** - * RC Free effects list */ - if( pC->pEffectsList != M4OSA_NULL ) - { - free(pC->pEffectsList); - pC->pEffectsList = M4OSA_NULL; - } - - /** - * RC Free active effects list */ - if( pC->pActiveEffectsList != M4OSA_NULL ) - { - free(pC->pActiveEffectsList); - pC->pActiveEffectsList = M4OSA_NULL; - } - /** - * Free active effects list */ - if(pC->pActiveEffectsList1 != M4OSA_NULL) - { - free(pC->pActiveEffectsList1); - pC->pActiveEffectsList1 = M4OSA_NULL; - } - if(pC->m_air_context != M4OSA_NULL) { - free(pC->m_air_context); - pC->m_air_context = M4OSA_NULL; - } - /** - * Update state automaton */ - pC->State = M4VSS3GPP_kEditState_CLOSED; - - /** - * Return with no error */ - M4OSA_TRACE3_1("M4VSS3GPP_editClose(): returning 0x%x", returnedError); - return returnedError; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_editCleanUp() - * @brief Free all resources used by the VSS edit operation. - * @note The context is no more valid after this call - * @param pContext (IN) VSS edit context - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only) - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_editCleanUp( M4VSS3GPP_EditContext pContext ) -{ - M4OSA_ERR err; - M4VSS3GPP_InternalEditContext *pC = - (M4VSS3GPP_InternalEditContext *)pContext; - - M4OSA_TRACE3_1("M4VSS3GPP_editCleanUp called with pContext=0x%x", pContext); - - /** - * Check input parameter */ - if( M4OSA_NULL == pContext ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_editCleanUp(): pContext is M4OSA_NULL, returning M4ERR_PARAMETER"); - return M4ERR_PARAMETER; - } - - /** - * Close, if needed. - * In "theory", we should not close if we are in CREATED state. - * But in practice, in case the opening failed, it may have been partially done. - * In that case we have to free some opened ressources by calling Close. */ - if( M4VSS3GPP_kEditState_CLOSED != pC->State ) - { - M4OSA_TRACE3_0("M4VSS3GPP_editCleanUp(): calling M4VSS3GPP_editClose"); - err = M4VSS3GPP_editClose(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editCleanUp(): M4VSS3GPP_editClose returns 0x%x", - err); - } - } - - /** - * Free the video encoder dummy AU */ - if( M4OSA_NULL != pC->ewc.pDummyAuBuffer ) - { - free(pC->ewc.pDummyAuBuffer); - pC->ewc.pDummyAuBuffer = M4OSA_NULL; - } - - /** - * Free the Audio encoder context */ - if( M4OSA_NULL != pC->ewc.pAudioEncCtxt ) - { - err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctClose( - pC->ewc.pAudioEncCtxt); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editCleanUp: pAudioEncoderGlobalFcts->pFctClose returns 0x%x", - err); - /**< don't return, we still have stuff to free */ - } - - err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctCleanUp( - pC->ewc.pAudioEncCtxt); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_editCleanUp: pAudioEncoderGlobalFcts->pFctCleanUp returns 0x%x", - err); - /**< don't return, we still have stuff to free */ - } - - pC->ewc.pAudioEncCtxt = M4OSA_NULL; - } - - /** - * Free the shells interfaces */ - M4VSS3GPP_unRegisterAllWriters(&pC->ShellAPI); - M4VSS3GPP_unRegisterAllEncoders(&pC->ShellAPI); - M4VSS3GPP_unRegisterAllReaders(&pC->ShellAPI); - M4VSS3GPP_unRegisterAllDecoders(&pC->ShellAPI); - - /** - * Free the settings copied in the internal context */ - M4VSS3GPP_intFreeSettingsList(pC); - - /** - * Finally, Free context */ - free(pC); - pC = M4OSA_NULL; - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_editCleanUp(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -#ifdef WIN32 -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_GetErrorMessage() - * @brief Return a string describing the given error code - * @note The input string must be already allocated (and long enough!) - * @param err (IN) Error code to get the description from - * @param sMessage (IN/OUT) Allocated string in which the description will be copied - * @return M4NO_ERROR: Input error is from the VSS3GPP module - * @return M4ERR_PARAMETER:Input error is not from the VSS3GPP module - ****************************************************************************** - */ - -M4OSA_ERR M4VSS3GPP_GetErrorMessage( M4OSA_ERR err, M4OSA_Char *sMessage ) -{ - switch( err ) - { - case M4VSS3GPP_WAR_EDITING_DONE: - strcpy(sMessage, "M4VSS3GPP_WAR_EDITING_DONE"); - break; - - case M4VSS3GPP_WAR_END_OF_AUDIO_MIXING: - strcpy(sMessage, "M4VSS3GPP_WAR_END_OF_AUDIO_MIXING"); - break; - - case M4VSS3GPP_WAR_END_OF_EXTRACT_PICTURE: - strcpy(sMessage, "M4VSS3GPP_WAR_END_OF_EXTRACT_PICTURE"); - break; - - case M4VSS3GPP_ERR_INVALID_FILE_TYPE: - strcpy(sMessage, "M4VSS3GPP_ERR_INVALID_FILE_TYPE"); - break; - - case M4VSS3GPP_ERR_INVALID_EFFECT_KIND: - strcpy(sMessage, "M4VSS3GPP_ERR_INVALID_EFFECT_KIND"); - break; - - case M4VSS3GPP_ERR_INVALID_VIDEO_EFFECT_TYPE: - strcpy(sMessage, "M4VSS3GPP_ERR_INVALID_VIDEO_EFFECT_TYPE"); - break; - - case M4VSS3GPP_ERR_INVALID_AUDIO_EFFECT_TYPE: - strcpy(sMessage, "M4VSS3GPP_ERR_INVALID_AUDIO_EFFECT_TYPE"); - break; - - case M4VSS3GPP_ERR_INVALID_VIDEO_TRANSITION_TYPE: - strcpy(sMessage, "M4VSS3GPP_ERR_INVALID_VIDEO_TRANSITION_TYPE"); - break; - - case M4VSS3GPP_ERR_INVALID_AUDIO_TRANSITION_TYPE: - strcpy(sMessage, "M4VSS3GPP_ERR_INVALID_AUDIO_TRANSITION_TYPE"); - break; - - case M4VSS3GPP_ERR_INVALID_VIDEO_ENCODING_FRAME_RATE: - strcpy(sMessage, "M4VSS3GPP_ERR_INVALID_VIDEO_ENCODING_FRAME_RATE"); - break; - - case M4VSS3GPP_ERR_EXTERNAL_EFFECT_NULL: - strcpy(sMessage, "M4VSS3GPP_ERR_EXTERNAL_EFFECT_NULL"); - break; - - case M4VSS3GPP_ERR_EXTERNAL_TRANSITION_NULL: - strcpy(sMessage, "M4VSS3GPP_ERR_EXTERNAL_TRANSITION_NULL"); - break; - - case M4VSS3GPP_ERR_BEGIN_CUT_LARGER_THAN_DURATION: - strcpy(sMessage, "M4VSS3GPP_ERR_BEGIN_CUT_LARGER_THAN_DURATION"); - break; - - case M4VSS3GPP_ERR_BEGIN_CUT_LARGER_THAN_END_CUT: - strcpy(sMessage, "M4VSS3GPP_ERR_BEGIN_CUT_LARGER_THAN_END_CUT"); - break; - - case M4VSS3GPP_ERR_OVERLAPPING_TRANSITIONS: - strcpy(sMessage, "M4VSS3GPP_ERR_OVERLAPPING_TRANSITIONS"); - break; - - case M4VSS3GPP_ERR_INVALID_3GPP_FILE: - strcpy(sMessage, "M4VSS3GPP_ERR_INVALID_3GPP_FILE"); - break; - - case M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT: - strcpy(sMessage, "M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT"); - break; - - case M4VSS3GPP_ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT: - strcpy(sMessage, "M4VSS3GPP_ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT"); - break; - - case M4VSS3GPP_ERR_AMR_EDITING_UNSUPPORTED: - strcpy(sMessage, "M4VSS3GPP_ERR_AMR_EDITING_UNSUPPORTED"); - break; - - case M4VSS3GPP_ERR_INPUT_VIDEO_AU_TOO_LARGE: - strcpy(sMessage, "M4VSS3GPP_ERR_INPUT_VIDEO_AU_TOO_LARGE"); - break; - - case M4VSS3GPP_ERR_INPUT_AUDIO_AU_TOO_LARGE: - strcpy(sMessage, "M4VSS3GPP_ERR_INPUT_AUDIO_AU_TOO_LARGE"); - break; - - case M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AU: - strcpy(sMessage, "M4VSS3GPP_ERR_INPUT_AUDIO_CORRUPTED_AU"); - break; - - case M4VSS3GPP_ERR_ENCODER_ACCES_UNIT_ERROR: - strcpy(sMessage, "M4VSS3GPP_ERR_ENCODER_ACCES_UNIT_ERROR"); - break; - - case M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT: - strcpy(sMessage, "M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT"); - break; - - case M4VSS3GPP_ERR_EDITING_UNSUPPORTED_H263_PROFILE: - strcpy(sMessage, "M4VSS3GPP_ERR_EDITING_UNSUPPORTED_H263_PROFILE"); - break; - - case M4VSS3GPP_ERR_EDITING_UNSUPPORTED_MPEG4_PROFILE: - strcpy(sMessage, "M4VSS3GPP_ERR_EDITING_UNSUPPORTED_MPEG4_PROFILE"); - break; - - case M4VSS3GPP_ERR_EDITING_UNSUPPORTED_MPEG4_RVLC: - strcpy(sMessage, "M4VSS3GPP_ERR_EDITING_UNSUPPORTED_MPEG4_RVLC"); - break; - - case M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT: - strcpy(sMessage, "M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT"); - break; - - case M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_STREAM_IN_FILE: - strcpy(sMessage, - "M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_STREAM_IN_FILE"); - break; - - case M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_VIDEO_STREAM_IN_FILE: - strcpy(sMessage, - "M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_VIDEO_STREAM_IN_FILE"); - break; - - case M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION: - strcpy(sMessage, "M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION"); - break; - - case M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_FORMAT: - strcpy(sMessage, "M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_FORMAT"); - break; - - case M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_FRAME_SIZE: - strcpy(sMessage, "M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_FRAME_SIZE"); - break; - - case M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_TIME_SCALE: - strcpy(sMessage, "M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_TIME_SCALE"); - break; - - case M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_DATA_PARTITIONING: - strcpy(sMessage, - "M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_DATA_PARTITIONING"); - break; - - case M4VSS3GPP_ERR_UNSUPPORTED_MP3_ASSEMBLY: - strcpy(sMessage, "M4VSS3GPP_ERR_UNSUPPORTED_MP3_ASSEMBLY"); - break; - - case M4VSS3GPP_WAR_INCOMPATIBLE_AUDIO_STREAM_TYPE: - strcpy(sMessage, "M4VSS3GPP_WAR_INCOMPATIBLE_AUDIO_STREAM_TYPE"); - break; - - case M4VSS3GPP_WAR_INCOMPATIBLE_AUDIO_NB_OF_CHANNELS: - strcpy(sMessage, "M4VSS3GPP_WAR_INCOMPATIBLE_AUDIO_NB_OF_CHANNELS"); - break; - - case M4VSS3GPP_WAR_INCOMPATIBLE_AUDIO_SAMPLING_FREQUENCY: - strcpy(sMessage, - "M4VSS3GPP_WAR_INCOMPATIBLE_AUDIO_SAMPLING_FREQUENCY"); - break; - - case M4VSS3GPP_ERR_NO_SUPPORTED_STREAM_IN_FILE: - strcpy(sMessage, "M4VSS3GPP_ERR_NO_SUPPORTED_STREAM_IN_FILE"); - break; - - case M4VSS3GPP_ERR_ADDVOLUME_EQUALS_ZERO: - strcpy(sMessage, "M4VSS3GPP_ERR_ADDVOLUME_EQUALS_ZERO"); - break; - - case M4VSS3GPP_ERR_ADDCTS_HIGHER_THAN_VIDEO_DURATION: - strcpy(sMessage, "M4VSS3GPP_ERR_ADDCTS_HIGHER_THAN_VIDEO_DURATION"); - break; - - case M4VSS3GPP_ERR_UNDEFINED_AUDIO_TRACK_FILE_FORMAT: - strcpy(sMessage, "M4VSS3GPP_ERR_UNDEFINED_AUDIO_TRACK_FILE_FORMAT"); - break; - - case M4VSS3GPP_ERR_UNSUPPORTED_ADDED_AUDIO_STREAM: - strcpy(sMessage, "M4VSS3GPP_ERR_UNSUPPORTED_ADDED_AUDIO_STREAM"); - break; - - case M4VSS3GPP_ERR_AUDIO_MIXING_UNSUPPORTED: - strcpy(sMessage, "M4VSS3GPP_ERR_AUDIO_MIXING_UNSUPPORTED"); - break; - - case M4VSS3GPP_ERR_FEATURE_UNSUPPORTED_WITH_AUDIO_TRACK: - strcpy(sMessage, - "M4VSS3GPP_ERR_FEATURE_UNSUPPORTED_WITH_AUDIO_TRACK"); - break; - - case M4VSS3GPP_ERR_AUDIO_CANNOT_BE_MIXED: - strcpy(sMessage, "M4VSS3GPP_ERR_AUDIO_CANNOT_BE_MIXED"); - break; - - case M4VSS3GPP_ERR_INPUT_CLIP_IS_NOT_A_3GPP: - strcpy(sMessage, "M4VSS3GPP_ERR_INPUT_CLIP_IS_NOT_A_3GPP"); - break; - - case M4VSS3GPP_ERR_BEGINLOOP_HIGHER_ENDLOOP: - strcpy(sMessage, "M4VSS3GPP_ERR_BEGINLOOP_HIGHER_ENDLOOP"); - break; - - case M4VSS3GPP_ERR_H263_PROFILE_NOT_SUPPORTED: - strcpy(sMessage, "M4VSS3GPP_ERR_H263_PROFILE_NOT_SUPPORTED"); - break; - - case M4VSS3GPP_ERR_NO_SUPPORTED_VIDEO_STREAM_IN_FILE: - strcpy(sMessage, "M4VSS3GPP_ERR_NO_SUPPORTED_VIDEO_STREAM_IN_FILE"); - break; - - default: /**< Not a VSS3GPP error */ - strcpy(sMessage, ""); - return M4ERR_PARAMETER; - } - return M4NO_ERROR; -} - -#endif /* WIN32 */ - -/********************************************************/ -/********************************************************/ -/********************************************************/ -/**************** STATIC FUNCTIONS ******************/ -/********************************************************/ -/********************************************************/ -/********************************************************/ - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intClipSettingsSanityCheck() - * @brief Simplify the given clip settings - * @note This function may modify the given structure - * @param pClip (IN/OUT) Clip settings - * @return M4NO_ERROR: No error - * @return M4VSS3GPP_ERR_EXTERNAL_EFFECT_NULL: - ****************************************************************************** - */ - -static M4OSA_ERR M4VSS3GPP_intClipSettingsSanityCheck( - M4VSS3GPP_ClipSettings *pClip ) -{ - M4OSA_UInt8 uiFx; - M4OSA_UInt32 - uiClipActualDuration; /**< the clip duration once the cuts are done */ - M4OSA_UInt32 uiDuration; - M4VSS3GPP_EffectSettings *pFx; - - /** - * If begin cut is too far, return an error */ - uiDuration = pClip->ClipProperties.uiClipDuration; - - if( pClip->uiBeginCutTime > uiDuration ) - { - M4OSA_TRACE1_2( - "M4VSS3GPP_intClipSettingsSanityCheck: %d > %d,\ - returning M4VSS3GPP_ERR_BEGIN_CUT_LARGER_THAN_DURATION", - pClip->uiBeginCutTime, uiDuration); - return M4VSS3GPP_ERR_BEGIN_CUT_LARGER_THAN_DURATION; - } - - /** - * If end cut is too far, set to zero (it means no end cut) */ - if( pClip->uiEndCutTime > uiDuration ) - { - pClip->uiEndCutTime = 0; - } - - /** - * Compute actual clip duration (once cuts are done) */ - if( 0 == pClip->uiEndCutTime ) - { - /** - * No end cut */ - uiClipActualDuration = uiDuration - pClip->uiBeginCutTime; - } - else - { - if( pClip->uiBeginCutTime >= pClip->uiEndCutTime ) - { - M4OSA_TRACE1_2( - "M4VSS3GPP_intClipSettingsSanityCheck: %d > %d,\ - returning M4VSS3GPP_ERR_BEGIN_CUT_LARGER_THAN_END_CUT", - pClip->uiBeginCutTime, pClip->uiEndCutTime); - return M4VSS3GPP_ERR_BEGIN_CUT_LARGER_THAN_END_CUT; - } - uiClipActualDuration = pClip->uiEndCutTime - pClip->uiBeginCutTime; - } - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intTransitionSettingsSanityCheck() - * @brief Simplify the given transition settings - * @note This function may modify the given structure - * @param pTransition (IN/OUT) Transition settings - * @return M4NO_ERROR: No error - * @return M4VSS3GPP_ERR_EXTERNAL_TRANSITION_NULL: - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intTransitionSettingsSanityCheck( - M4VSS3GPP_TransitionSettings *pTransition ) -{ - /** - * No transition */ - if( 0 == pTransition->uiTransitionDuration ) - { - pTransition->VideoTransitionType = M4VSS3GPP_kVideoTransitionType_None; - pTransition->AudioTransitionType = M4VSS3GPP_kAudioTransitionType_None; - } - else if( ( M4VSS3GPP_kVideoTransitionType_None - == pTransition->VideoTransitionType) - && (M4VSS3GPP_kAudioTransitionType_None - == pTransition->AudioTransitionType) ) - { - pTransition->uiTransitionDuration = 0; - } - - /** - * Check external transition function is set */ - if( ( pTransition->VideoTransitionType - >= M4VSS3GPP_kVideoTransitionType_External) - && (M4OSA_NULL == pTransition->ExtVideoTransitionFct) ) - { - return M4VSS3GPP_ERR_EXTERNAL_TRANSITION_NULL; - } - - /** - * Set minimal transition duration */ - if( ( pTransition->uiTransitionDuration > 0) - && (pTransition->uiTransitionDuration - < M4VSS3GPP_MINIMAL_TRANSITION_DURATION) ) - { - pTransition->uiTransitionDuration = - M4VSS3GPP_MINIMAL_TRANSITION_DURATION; - } - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intFreeSettingsList() - * @brief Free the settings copied in the internal context - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -static M4OSA_Void M4VSS3GPP_intFreeSettingsList( - M4VSS3GPP_InternalEditContext *pC ) -{ - M4OSA_UInt32 i; - - /** - * Free the settings list */ - if( M4OSA_NULL != pC->pClipList ) - { - for ( i = 0; i < pC->uiClipNumber; i++ ) - { - M4VSS3GPP_editFreeClipSettings(&(pC->pClipList[i])); - } - - free(pC->pClipList); - pC->pClipList = M4OSA_NULL; - } - - /** - * Free the transition list */ - if( M4OSA_NULL != pC->pTransitionList ) - { - free(pC->pTransitionList); - pC->pTransitionList = M4OSA_NULL; - } -} -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intCreateMP3OutputFile() - * @brief Creates and prepare the output MP file - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -static M4OSA_ERR -M4VSS3GPP_intCreateMP3OutputFile( M4VSS3GPP_InternalEditContext *pC, - M4OSA_Void *pOutputFile ) -{ - M4OSA_ERR err; - - err = - pC->pOsaFileWritPtr->openWrite(&pC->ewc.p3gpWriterContext, pOutputFile, - M4OSA_kFileWrite); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreateMP3OutputFile: WriteOpen returns 0x%x!", err); - return err; - } - - return M4NO_ERROR; -} -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intCreate3GPPOutputFile() - * @brief Creates and prepare the output MP3 file - * @note Creates the writer, Creates the output file, Adds the streams, - Readies the writing process - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -M4OSA_ERR -M4VSS3GPP_intCreate3GPPOutputFile( M4VSS3GPP_EncodeWriteContext *pC_ewc, - M4VSS3GPP_MediaAndCodecCtxt *pC_ShellAPI, - M4OSA_FileWriterPointer *pOsaFileWritPtr, - M4OSA_Void *pOutputFile, - M4OSA_FileReadPointer *pOsaFileReadPtr, - M4OSA_Void *pTempFile, - M4OSA_UInt32 maxOutputFileSize ) -{ - M4OSA_ERR err; - M4OSA_UInt32 uiVersion; - M4SYS_StreamIDValue temp; - - M4OSA_TRACE3_2( - "M4VSS3GPP_intCreate3GPPOutputFile called with pC_ewc=0x%x, pOutputFile=0x%x", - pC_ewc, pOutputFile); - - /** - * Check input parameter */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pC_ewc), M4ERR_PARAMETER, - "M4VSS3GPP_intCreate3GPPOutputFile: pC_ewc is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pOutputFile), M4ERR_PARAMETER, - "M4VSS3GPP_intCreate3GPPOutputFile: pOutputFile is M4OSA_NULL"); - - /* Set writer */ - err = - M4VSS3GPP_setCurrentWriter(pC_ShellAPI, M4VIDEOEDITING_kFileType_3GPP); - M4ERR_CHECK_RETURN(err); - - /** - * Create the output file */ - err = pC_ShellAPI->pWriterGlobalFcts->pFctOpen(&pC_ewc->p3gpWriterContext, - pOutputFile, pOsaFileWritPtr, pTempFile, pOsaFileReadPtr); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreate3GPPOutputFile: pWriterGlobalFcts->pFctOpen returns 0x%x!", - err); - return err; - } - - /** - * Set the signature option of the writer */ - err = - pC_ShellAPI->pWriterGlobalFcts->pFctSetOption(pC_ewc->p3gpWriterContext, - M4WRITER_kEmbeddedString, (M4OSA_DataOption)"NXP-SW : VSS "); - - if( ( M4NO_ERROR != err) && (((M4OSA_UInt32)M4ERR_BAD_OPTION_ID) - != err) ) /* this option may not be implemented by some writers */ - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreate3GPPOutputFile:\ - pWriterGlobalFcts->pFctSetOption(M4WRITER_kEmbeddedString) returns 0x%x!", - err); - return err; - } - - /*11/12/2008 CR3283 MMS use case for VideoArtist: - Set the max output file size option in the writer so that the output file will be - smaller than the given file size limitation*/ - if( maxOutputFileSize > 0 ) - { - err = pC_ShellAPI->pWriterGlobalFcts->pFctSetOption( - pC_ewc->p3gpWriterContext, - M4WRITER_kMaxFileSize, &maxOutputFileSize); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreate3GPPOutputFile:\ - writer set option M4WRITER_kMaxFileSize returns 0x%x", - err); - return err; - } - } - - /** - * Set the version option of the writer */ - uiVersion = - (M4VIDEOEDITING_VERSION_MAJOR * 100 + M4VIDEOEDITING_VERSION_MINOR * 10 - + M4VIDEOEDITING_VERSION_REVISION); - err = - pC_ShellAPI->pWriterGlobalFcts->pFctSetOption(pC_ewc->p3gpWriterContext, - M4WRITER_kEmbeddedVersion, (M4OSA_DataOption) &uiVersion); - - if( ( M4NO_ERROR != err) && (((M4OSA_UInt32)M4ERR_BAD_OPTION_ID) - != err) ) /* this option may not be implemented by some writers */ - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreate3GPPOutputFile:\ - pWriterGlobalFcts->pFctSetOption(M4WRITER_kEmbeddedVersion) returns 0x%x!", - err); - return err; - } - - if( M4SYS_kVideoUnknown != pC_ewc->VideoStreamType ) - { - /** - * Set the video stream properties */ - pC_ewc->WriterVideoStreamInfo.height = pC_ewc->uiVideoHeight; - pC_ewc->WriterVideoStreamInfo.width = pC_ewc->uiVideoWidth; - pC_ewc->WriterVideoStreamInfo.fps = - 0.0; /**< Not used by the shell/core writer */ - pC_ewc->WriterVideoStreamInfo.Header.pBuf = - pC_ewc->pVideoOutputDsi; /**< Previously computed output DSI */ - pC_ewc->WriterVideoStreamInfo.Header.Size = pC_ewc-> - uiVideoOutputDsiSize; /**< Previously computed output DSI size */ - - pC_ewc->WriterVideoStream.streamType = pC_ewc->VideoStreamType; - - switch( pC_ewc->VideoStreamType ) - { - case M4SYS_kMPEG_4: - case M4SYS_kH263: - case M4SYS_kH264: - /**< We HAVE to put a value here... */ - pC_ewc->WriterVideoStream.averageBitrate = - pC_ewc->uiVideoBitrate; - pC_ewc->WriterVideoStream.maxBitrate = pC_ewc->uiVideoBitrate; - break; - - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreate3GPPOutputFile: unknown input video format (0x%x),\ - returning M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT!", - pC_ewc->VideoStreamType); - return M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT; - } - - pC_ewc->WriterVideoStream.streamID = M4VSS3GPP_WRITER_VIDEO_STREAM_ID; - pC_ewc->WriterVideoStream.timeScale = - 0; /**< Not used by the shell/core writer */ - pC_ewc->WriterVideoStream.profileLevel = - 0; /**< Not used by the shell/core writer */ - pC_ewc->WriterVideoStream.duration = - 0; /**< Not used by the shell/core writer */ - - pC_ewc->WriterVideoStream.decoderSpecificInfoSize = - sizeof(M4WRITER_StreamVideoInfos); - pC_ewc->WriterVideoStream.decoderSpecificInfo = - (M4OSA_MemAddr32) &(pC_ewc->WriterVideoStreamInfo); - - /** - * Add the video stream */ - err = pC_ShellAPI->pWriterGlobalFcts->pFctAddStream( - pC_ewc->p3gpWriterContext, &pC_ewc->WriterVideoStream); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreate3GPPOutputFile:\ - pWriterGlobalFcts->pFctAddStream(video) returns 0x%x!", - err); - return err; - } - - /** - * Update AU properties for video stream */ - pC_ewc->WriterVideoAU.attribute = AU_RAP; - pC_ewc->WriterVideoAU.CTS = 0; - pC_ewc->WriterVideoAU.DTS = 0; /** Reset time */ - pC_ewc->WriterVideoAU.frag = M4OSA_NULL; - pC_ewc->WriterVideoAU.nbFrag = 0; /** No fragment */ - pC_ewc->WriterVideoAU.size = 0; - pC_ewc->WriterVideoAU.dataAddress = M4OSA_NULL; - pC_ewc->WriterVideoAU.stream = &(pC_ewc->WriterVideoStream); - - /** - * Set the writer max video AU size */ - pC_ewc->uiVideoMaxAuSize = (M4OSA_UInt32)(1.5F - *(M4OSA_Float)(pC_ewc->WriterVideoStreamInfo.width - * pC_ewc->WriterVideoStreamInfo.height) - * M4VSS3GPP_VIDEO_MIN_COMPRESSION_RATIO); - temp.streamID = M4VSS3GPP_WRITER_VIDEO_STREAM_ID; - temp.value = pC_ewc->uiVideoMaxAuSize; - err = pC_ShellAPI->pWriterGlobalFcts->pFctSetOption( - pC_ewc->p3gpWriterContext, (M4OSA_UInt32)M4WRITER_kMaxAUSize, - (M4OSA_DataOption) &temp); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreate3GPPOutputFile:\ - pWriterGlobalFcts->pFctSetOption(M4WRITER_kMaxAUSize, video) returns 0x%x!", - err); - return err; - } - - /** - * Set the writer max video chunk size */ - temp.streamID = M4VSS3GPP_WRITER_VIDEO_STREAM_ID; - temp.value = (M4OSA_UInt32)(pC_ewc->uiVideoMaxAuSize \ - * M4VSS3GPP_VIDEO_AU_SIZE_TO_CHUNCK_SIZE_RATIO); /**< from max AU size to - max Chunck size */ - err = pC_ShellAPI->pWriterGlobalFcts->pFctSetOption( - pC_ewc->p3gpWriterContext, - (M4OSA_UInt32)M4WRITER_kMaxChunckSize, - (M4OSA_DataOption) &temp); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreate3GPPOutputFile:\ - pWriterGlobalFcts->pFctSetOption(M4WRITER_kMaxAUSize, video) returns 0x%x!", - err); - return err; - } - } - - if( M4SYS_kAudioUnknown != pC_ewc->AudioStreamType ) - { - M4WRITER_StreamAudioInfos streamAudioInfo; - - streamAudioInfo.nbSamplesPerSec = 0; /**< unused by our shell writer */ - streamAudioInfo.nbBitsPerSample = 0; /**< unused by our shell writer */ - streamAudioInfo.nbChannels = 1; /**< unused by our shell writer */ - - if( pC_ewc->pAudioOutputDsi != M4OSA_NULL ) - { - /* If we copy the stream from the input, we copy its DSI */ - streamAudioInfo.Header.Size = pC_ewc->uiAudioOutputDsiSize; - streamAudioInfo.Header.pBuf = pC_ewc->pAudioOutputDsi; - } - else - { - /* Writer will put a default DSI */ - streamAudioInfo.Header.Size = 0; - streamAudioInfo.Header.pBuf = M4OSA_NULL; - } - - pC_ewc->WriterAudioStream.streamID = M4VSS3GPP_WRITER_AUDIO_STREAM_ID; - pC_ewc->WriterAudioStream.streamType = pC_ewc->AudioStreamType; - pC_ewc->WriterAudioStream.duration = - 0; /**< Not used by the shell/core writer */ - pC_ewc->WriterAudioStream.profileLevel = - 0; /**< Not used by the shell/core writer */ - pC_ewc->WriterAudioStreamInfo.nbSamplesPerSec = - pC_ewc->uiSamplingFrequency; - pC_ewc->WriterAudioStream.timeScale = pC_ewc->uiSamplingFrequency; - pC_ewc->WriterAudioStreamInfo.nbChannels = - (M4OSA_UInt16)pC_ewc->uiNbChannels; - pC_ewc->WriterAudioStreamInfo.nbBitsPerSample = - 0; /**< Not used by the shell/core writer */ - - /** - * Add the audio stream */ - switch( pC_ewc->AudioStreamType ) - { - case M4SYS_kAMR: - pC_ewc->WriterAudioStream.averageBitrate = - 0; /**< It is not used by the shell, the DSI is taken into account instead */ - pC_ewc->WriterAudioStream.maxBitrate = - 0; /**< Not used by the shell/core writer */ - break; - - case M4SYS_kAAC: - pC_ewc->WriterAudioStream.averageBitrate = - pC_ewc->uiAudioBitrate; - pC_ewc->WriterAudioStream.maxBitrate = pC_ewc->uiAudioBitrate; - break; - - case M4SYS_kEVRC: - pC_ewc->WriterAudioStream.averageBitrate = - 0; /**< It is not used by the shell, the DSI is taken into account instead */ - pC_ewc->WriterAudioStream.maxBitrate = - 0; /**< Not used by the shell/core writer */ - break; - - case M4SYS_kMP3: /**< there can't be MP3 track in 3GPP file -> error */ - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreate3GPPOutputFile: unknown output audio format (0x%x),\ - returning M4VSS3GPP_ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT!", - pC_ewc->AudioStreamType); - return M4VSS3GPP_ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT; - } - - /** - * Our writer shell interface is a little tricky: we put M4WRITER_StreamAudioInfos - in the DSI pointer... */ - pC_ewc->WriterAudioStream.decoderSpecificInfo = - (M4OSA_MemAddr32) &streamAudioInfo; - - /** - * Link the AU and the stream */ - pC_ewc->WriterAudioAU.stream = &(pC_ewc->WriterAudioStream); - pC_ewc->WriterAudioAU.dataAddress = M4OSA_NULL; - pC_ewc->WriterAudioAU.size = 0; - pC_ewc->WriterAudioAU.CTS = - -pC_ewc->iSilenceFrameDuration; /** Reset time */ - pC_ewc->WriterAudioAU.DTS = 0; - pC_ewc->WriterAudioAU.attribute = 0; - pC_ewc->WriterAudioAU.nbFrag = 0; /** No fragment */ - pC_ewc->WriterAudioAU.frag = M4OSA_NULL; - - err = pC_ShellAPI->pWriterGlobalFcts->pFctAddStream( - pC_ewc->p3gpWriterContext, &pC_ewc->WriterAudioStream); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreate3GPPOutputFile:\ - pWriterGlobalFcts->pFctAddStream(audio) returns 0x%x!", - err); - return err; - } - - /** - * Set the writer max audio AU size */ - pC_ewc->uiAudioMaxAuSize = M4VSS3GPP_AUDIO_MAX_AU_SIZE; - temp.streamID = M4VSS3GPP_WRITER_AUDIO_STREAM_ID; - temp.value = pC_ewc->uiAudioMaxAuSize; - err = pC_ShellAPI->pWriterGlobalFcts->pFctSetOption( - pC_ewc->p3gpWriterContext, (M4OSA_UInt32)M4WRITER_kMaxAUSize, - (M4OSA_DataOption) &temp); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreate3GPPOutputFile:\ - pWriterGlobalFcts->pFctSetOption(M4WRITER_kMaxAUSize, audio) returns 0x%x!", - err); - return err; - } - - /** - * Set the writer max audio chunck size */ - temp.streamID = M4VSS3GPP_WRITER_AUDIO_STREAM_ID; - temp.value = M4VSS3GPP_AUDIO_MAX_CHUNCK_SIZE; - err = pC_ShellAPI->pWriterGlobalFcts->pFctSetOption( - pC_ewc->p3gpWriterContext, - (M4OSA_UInt32)M4WRITER_kMaxChunckSize, - (M4OSA_DataOption) &temp); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreate3GPPOutputFile:\ - pWriterGlobalFcts->pFctSetOption(M4WRITER_kMaxAUSize, audio) returns 0x%x!", - err); - return err; - } - } - - /** - * All streams added, we're now ready to write */ - err = pC_ShellAPI->pWriterGlobalFcts->pFctStartWriting( - pC_ewc->p3gpWriterContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreate3GPPOutputFile:\ - pWriterGlobalFcts->pFctStartWriting() returns 0x%x!", - err); - return err; - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intCreate3GPPOutputFile(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intComputeOutputVideoAndAudioDsi() - * @brief Generate a H263 or MPEG-4 decoder specific info compatible with all input video - * tracks. Copy audio dsi from master clip. - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -static M4OSA_ERR -M4VSS3GPP_intComputeOutputVideoAndAudioDsi( M4VSS3GPP_InternalEditContext *pC, - M4OSA_UInt8 uiMasterClip ) -{ - M4OSA_Int32 iResynchMarkerDsiIndex; - M4_StreamHandler *pStreamForDsi; - M4VSS3GPP_ClipContext *pClip; - M4OSA_ERR err; - M4OSA_UInt32 i; - M4DECODER_MPEG4_DecoderConfigInfo DecConfigInfo; - M4DECODER_VideoSize dummySize; - M4OSA_Bool bGetDSiFromEncoder = M4OSA_FALSE; - - M4ENCODER_Header *encHeader; - M4SYS_StreamIDmemAddr streamHeader; - - pStreamForDsi = M4OSA_NULL; - pClip = M4OSA_NULL; - - /** - * H263 case */ - if( M4SYS_kH263 == pC->ewc.VideoStreamType ) - { - /** - * H263 output DSI is always 7 bytes */ - pC->ewc.uiVideoOutputDsiSize = 7; - pC->ewc.pVideoOutputDsi = - (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(pC->ewc.uiVideoOutputDsiSize, - M4VSS3GPP, (M4OSA_Char *)"pC->ewc.pVideoOutputDsi (H263)"); - - if( M4OSA_NULL == pC->ewc.pVideoOutputDsi ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi():\ - unable to allocate pVideoOutputDsi (H263), returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - - /** - * (We override the input vendor info. - * At least we know that nothing special will be tried with PHLP-stamped - edited streams...) */ - pC->ewc.pVideoOutputDsi[0] = 'P'; - pC->ewc.pVideoOutputDsi[1] = 'H'; - pC->ewc.pVideoOutputDsi[2] = 'L'; - pC->ewc.pVideoOutputDsi[3] = 'P'; - - /** - * Decoder version is 0 */ - pC->ewc.pVideoOutputDsi[4] = 0; - - /** - * Level is the sixth byte in the DSI */ - pC->ewc.pVideoOutputDsi[5] = pC->xVSS.outputVideoLevel; - - /** - * Profile is the seventh byte in the DSI*/ - pC->ewc.pVideoOutputDsi[6] = pC->xVSS.outputVideoProfile; - } - - /** - * MPEG-4 case */ - else if( M4SYS_kMPEG_4 == pC->ewc.VideoStreamType || - M4SYS_kH264 == pC->ewc.VideoStreamType) { - - /* For MPEG4 and H.264 encoder case - * Fetch the DSI from the shell video encoder, and feed it to the writer before - closing it. */ - - M4OSA_TRACE1_0( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi: get DSI for H264 stream"); - - if( M4OSA_NULL == pC->ewc.pEncContext ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi: pC->ewc.pEncContext is NULL"); - err = M4VSS3GPP_intCreateVideoEncoder(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi:\ - M4VSS3GPP_intCreateVideoEncoder returned error 0x%x", - err); - } - } - - if( M4OSA_NULL != pC->ewc.pEncContext ) - { - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctGetOption( - pC->ewc.pEncContext, M4ENCODER_kOptionID_EncoderHeader, - (M4OSA_DataOption) &encHeader); - - if( ( M4NO_ERROR != err) || (M4OSA_NULL == encHeader->pBuf) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi:\ - failed to get the encoder header (err 0x%x)", - err); - M4OSA_TRACE1_2( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi: encHeader->pBuf=0x%x, size=0x%x", - encHeader->pBuf, encHeader->Size); - } - else - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi:\ - send DSI for video stream to 3GP writer"); - - /** - * Allocate and copy the new DSI */ - pC->ewc.pVideoOutputDsi = - (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc(encHeader->Size, M4VSS3GPP, - (M4OSA_Char *)"pC->ewc.pVideoOutputDsi (H264)"); - - if( M4OSA_NULL == pC->ewc.pVideoOutputDsi ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi():\ - unable to allocate pVideoOutputDsi, returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - pC->ewc.uiVideoOutputDsiSize = (M4OSA_UInt16)encHeader->Size; - memcpy((void *)pC->ewc.pVideoOutputDsi, (void *)encHeader->pBuf, - encHeader->Size); - } - - err = M4VSS3GPP_intDestroyVideoEncoder(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi:\ - M4VSS3GPP_intDestroyVideoEncoder returned error 0x%x", - err); - } - } - else - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi:\ - pC->ewc.pEncContext is NULL, cannot get the DSI"); - } - } - - pStreamForDsi = M4OSA_NULL; - pClip = M4OSA_NULL; - - /* Compute Audio DSI */ - if( M4SYS_kAudioUnknown != pC->ewc.AudioStreamType ) - { - if( uiMasterClip == 0 ) - { - /* Clip is already opened */ - pStreamForDsi = &(pC->pC1->pAudioStream->m_basicProperties); - } - else - { - /** - * We can use the fast open mode to get the DSI */ - err = M4VSS3GPP_intClipInit(&pClip, pC->pOsaFileReadPtr); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi:\ - M4VSS3GPP_intClipInit() returns 0x%x!", - err); - - if( pClip != M4OSA_NULL ) - { - M4VSS3GPP_intClipCleanUp(pClip); - } - return err; - } - - err = M4VSS3GPP_intClipOpen(pClip, &pC->pClipList[uiMasterClip], - M4OSA_FALSE, M4OSA_TRUE, M4OSA_TRUE); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi:\ - M4VSS3GPP_intClipOpen() returns 0x%x!", - err); - M4VSS3GPP_intClipCleanUp(pClip); - return err; - } - - pStreamForDsi = &(pClip->pAudioStream->m_basicProperties); - } - - /** - * Allocate and copy the new DSI */ - pC->ewc.pAudioOutputDsi = (M4OSA_MemAddr8)M4OSA_32bitAlignedMalloc( - pStreamForDsi->m_decoderSpecificInfoSize, - M4VSS3GPP, (M4OSA_Char *)"pC->ewc.pAudioOutputDsi"); - - if( M4OSA_NULL == pC->ewc.pAudioOutputDsi ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi():\ - unable to allocate pAudioOutputDsi, returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - pC->ewc.uiAudioOutputDsiSize = - (M4OSA_UInt16)pStreamForDsi->m_decoderSpecificInfoSize; - memcpy((void *)pC->ewc.pAudioOutputDsi, - (void *)pStreamForDsi->m_pDecoderSpecificInfo, - pC->ewc.uiAudioOutputDsiSize); - - /** - * If a clip has been temporarily opened to get its DSI, close it */ - if( M4OSA_NULL != pClip ) - { - err = M4VSS3GPP_intClipCleanUp(pClip); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi:\ - M4VSS3GPP_intClipCleanUp() returns 0x%x!", - err); - return err; - } - } - } - - /** - * Return with no error */ - M4OSA_TRACE3_0( - "M4VSS3GPP_intComputeOutputVideoAndAudioDsi(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intSwitchToNextClip() - * @brief Switch from the current clip to the next one - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intSwitchToNextClip( - M4VSS3GPP_InternalEditContext *pC ) -{ - M4OSA_ERR err; - - if( M4OSA_NULL != pC->pC1 ) - { - if (M4OSA_NULL != pC->pC1->m_pPreResizeFrame) { - if (M4OSA_NULL != pC->pC1->m_pPreResizeFrame[0].pac_data) { - free(pC->pC1->m_pPreResizeFrame[0].pac_data); - pC->pC1->m_pPreResizeFrame[0].pac_data = M4OSA_NULL; - } - if (M4OSA_NULL != pC->pC1->m_pPreResizeFrame[1].pac_data) { - free(pC->pC1->m_pPreResizeFrame[1].pac_data); - pC->pC1->m_pPreResizeFrame[1].pac_data = M4OSA_NULL; - } - if (M4OSA_NULL != pC->pC1->m_pPreResizeFrame[2].pac_data) { - free(pC->pC1->m_pPreResizeFrame[2].pac_data); - pC->pC1->m_pPreResizeFrame[2].pac_data = M4OSA_NULL; - } - free(pC->pC1->m_pPreResizeFrame); - pC->pC1->m_pPreResizeFrame = M4OSA_NULL; - } - /** - * Close the current first clip */ - err = M4VSS3GPP_intClipCleanUp(pC->pC1); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intSwitchToNextClip: M4VSS3GPP_intClipCleanUp(C1) returns 0x%x!", - err); - return err; - } - - /** - * increment clip counter */ - pC->uiCurrentClip++; - } - - /** - * Check if we reached the last clip */ - if( pC->uiCurrentClip >= pC->uiClipNumber ) - { - pC->pC1 = M4OSA_NULL; - pC->State = M4VSS3GPP_kEditState_FINISHED; - - M4OSA_TRACE1_0( - "M4VSS3GPP_intSwitchToNextClip:\ - M4VSS3GPP_intClipClose(C1) returns M4VSS3GPP_WAR_EDITING_DONE"); - return M4VSS3GPP_WAR_EDITING_DONE; - } - - /** - * If the next clip has already be opened, set it as first clip */ - if( M4OSA_NULL != pC->pC2 ) - { - pC->pC1 = pC->pC2; - if(M4OSA_NULL != pC->pC2->m_pPreResizeFrame) { - pC->pC1->m_pPreResizeFrame = pC->pC2->m_pPreResizeFrame; - } - pC->pC2 = M4OSA_NULL; - pC->bClip1ActiveFramingEffect = pC->bClip2ActiveFramingEffect; - pC->bClip2ActiveFramingEffect = M4OSA_FALSE; - } - /** - * else open it */ - else - { - err = M4VSS3GPP_intOpenClip(pC, &pC->pC1, - &pC->pClipList[pC->uiCurrentClip]); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intSwitchToNextClip: M4VSS3GPP_intOpenClip() returns 0x%x!", - err); - return err; - } - - /** - * If the second clip has not been opened yet, - that means that there has been no transition. - * So both output video and audio times are OK. - * So we can set both video2 and audio offsets */ - - /** - * Add current video output CTS to the clip video offset */ - - // Decorrelate input and output encoding timestamp to handle encoder prefetch - pC->pC1->iVoffset += (M4OSA_UInt32)pC->ewc.dInputVidCts; - /** - * Add current audio output CTS to the clip audio offset */ - pC->pC1->iAoffset += - (M4OSA_UInt32)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5); - - /** - * 2005-03-24: BugFix for audio-video synchro: - * There may be a portion of the duration of an audio AU of desynchro at each assembly. - * It leads to an audible desynchro when there are a lot of clips assembled. - * This bug fix allows to resynch the audio track when the delta is higher - * than one audio AU duration. - * We Step one AU in the second clip and we change the audio offset accordingly. */ - if( ( pC->pC1->iAoffset - - (M4OSA_Int32)(pC->pC1->iVoffset *pC->pC1->scale_audio + 0.5)) - > pC->ewc.iSilenceFrameDuration ) - { - /** - * Advance one AMR frame */ - err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pC1); - - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intSwitchToNextClip:\ - M4VSS3GPP_intClipReadNextAudioFrame returns 0x%x!", - err); - return err; - } - /** - * Update audio offset accordingly*/ - pC->pC1->iAoffset -= pC->ewc.iSilenceFrameDuration; - } - } - - /** - * Init starting state for this clip processing */ - if( M4SYS_kMP3 == pC->ewc.AudioStreamType ) - { - /** - * In the MP3 case we use a special audio state */ - pC->State = M4VSS3GPP_kEditState_MP3_JUMP; - } - else - { - /** - * We start with the video processing */ - pC->State = M4VSS3GPP_kEditState_VIDEO; - - if( pC->Vstate != M4VSS3GPP_kEditVideoState_TRANSITION ) - { - /* if not a transition then reset previous video state */ - pC->Vstate = M4VSS3GPP_kEditVideoState_READ_WRITE; - } - } - /* The flags are set to false at the beginning of every clip */ - pC->m_bClipExternalHasStarted = M4OSA_FALSE; - pC->bEncodeTillEoF = M4OSA_FALSE; - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intSwitchToNextClip(): returning M4NO_ERROR"); - /* RC: to know when a file has been processed */ - return M4VSS3GPP_WAR_SWITCH_CLIP; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intReachedEndOfVideo() - * @brief Do what to do when the end of a clip video track is reached - * @note If there is audio on the current clip, process it, else switch to the next clip - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intReachedEndOfVideo( M4VSS3GPP_InternalEditContext *pC ) -{ - M4OSA_ERR err; - - /** - * Video is done for this clip, now we do the audio */ - if( M4SYS_kAudioUnknown != pC->ewc.AudioStreamType ) - { - pC->State = M4VSS3GPP_kEditState_AUDIO; - } - else - { - /** - * Clip done, do the next one */ - err = M4VSS3GPP_intSwitchToNextClip(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intReachedEndOfVideo: M4VSS3GPP_intSwitchToNextClip() returns 0x%x", - err); - return err; - } - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intReachedEndOfVideo(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intReachedEndOfAudio() - * @brief Do what to do when the end of a clip audio track is reached - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intReachedEndOfAudio( M4VSS3GPP_InternalEditContext *pC ) -{ - M4OSA_ERR err; - - /** - * Clip done, do the next one */ - err = M4VSS3GPP_intSwitchToNextClip(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intReachedEndOfAudio: M4VSS3GPP_intSwitchToNextClip() returns 0x%x", - err); - return err; - } - - /** - * Start with the video */ - if( M4SYS_kVideoUnknown != pC->ewc.VideoStreamType ) - { - pC->State = M4VSS3GPP_kEditState_VIDEO; - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intReachedEndOfAudio(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intOpenClip() - * @brief Open next clip - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intOpenClip( M4VSS3GPP_InternalEditContext *pC, - M4VSS3GPP_ClipContext ** hClip, - M4VSS3GPP_ClipSettings *pClipSettings ) -{ - M4OSA_ERR err; - M4VSS3GPP_ClipContext *pClip; /**< shortcut */ - M4VIDEOEDITING_ClipProperties *pClipProperties = M4OSA_NULL; - M4OSA_Int32 iCts; - M4OSA_UInt32 i; - - M4OSA_TRACE2_1("M4VSS3GPP_intOpenClip: \"%s\"", - (M4OSA_Char *)pClipSettings->pFile); - - err = M4VSS3GPP_intClipInit(hClip, pC->pOsaFileReadPtr); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intOpenClip: M4VSS3GPP_intClipInit() returns 0x%x!", - err); - - if( *hClip != M4OSA_NULL ) - { - M4VSS3GPP_intClipCleanUp(*hClip); - } - return err; - } - - /** - * Set shortcut */ - pClip = *hClip; - - if (pClipSettings->FileType == M4VIDEOEDITING_kFileType_ARGB8888 ) { - pClipProperties = &pClipSettings->ClipProperties; - pClip->pSettings = pClipSettings; - pClip->iEndTime = pClipSettings->uiEndCutTime; - } - - err = M4VSS3GPP_intClipOpen(pClip, pClipSettings, - M4OSA_FALSE, M4OSA_FALSE, M4OSA_FALSE); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intOpenClip: \ - M4VSS3GPP_intClipOpen() returns 0x%x!", err); - M4VSS3GPP_intClipCleanUp(pClip); - *hClip = M4OSA_NULL; - return err; - } - - if (pClipSettings->FileType != M4VIDEOEDITING_kFileType_ARGB8888 ) { - pClipProperties = &pClip->pSettings->ClipProperties; - } - - /** - * Copy common 'silence frame stuff' to ClipContext */ - pClip->uiSilencePcmSize = pC->ewc.uiSilencePcmSize; - pClip->pSilenceFrameData = pC->ewc.pSilenceFrameData; - pClip->uiSilenceFrameSize = pC->ewc.uiSilenceFrameSize; - pClip->iSilenceFrameDuration = pC->ewc.iSilenceFrameDuration; - pClip->scale_audio = pC->ewc.scale_audio; - - pClip->iAudioFrameCts = -pClip->iSilenceFrameDuration; /* Reset time */ - - /** - * If the audio track is not compatible with the output audio format, - * we remove it. So it will be replaced by silence */ - if( M4OSA_FALSE == pClipProperties->bAudioIsCompatibleWithMasterClip ) - { - M4VSS3GPP_intClipDeleteAudioTrack(pClip); - } - - /** - * Actual begin cut */ - if( 0 == pClipSettings->uiBeginCutTime ) - { - pClip->iVoffset = 0; - pClip->iAoffset = 0; - pClip->iActualVideoBeginCut = 0; - pClip->iActualAudioBeginCut = 0; - } - else if(pClipSettings->FileType != M4VIDEOEDITING_kFileType_ARGB8888) { - if( M4SYS_kVideoUnknown != pC->ewc.VideoStreamType ) - { - /** - * Jump the video to the target begin cut to get the actual begin cut value */ - pClip->iActualVideoBeginCut = - (M4OSA_Int32)pClipSettings->uiBeginCutTime; - iCts = pClip->iActualVideoBeginCut; - - err = pClip->ShellAPI.m_pReader->m_pFctJump(pClip->pReaderContext, - (M4_StreamHandler *)pClip->pVideoStream, &iCts); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intOpenClip: m_pFctJump(V) returns 0x%x!", err); - return err; - } - - /** - * Update clip offset with the video begin cut */ - pClip->iVoffset = -pClip->iActualVideoBeginCut; - } - - if( M4SYS_kAudioUnknown != pC->ewc.AudioStreamType ) - { - /** - * Jump the audio to the video actual begin cut */ - if( M4VIDEOEDITING_kMP3 != pClipProperties->AudioStreamType ) - { - pClip->iActualAudioBeginCut = pClip->iActualVideoBeginCut; - iCts = (M4OSA_Int32)(pClip->iActualAudioBeginCut - * pClip->scale_audio + 0.5); - - err = M4VSS3GPP_intClipJumpAudioAt(pClip, &iCts); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intOpenClip: M4VSS3GPP_intClipJumpAudioAt(A) returns 0x%x!", - err); - return err; - } - /** - * Update clip offset with the audio begin cut */ - pClip->iAoffset = -iCts; - } - else - { - /** - * For the MP3, the jump is not done because of the VBR, - it could be not enough accurate */ - pClip->iActualAudioBeginCut = - (M4OSA_Int32)pClipSettings->uiBeginCutTime; - } - } - } - - if( M4SYS_kVideoUnknown != pC->ewc.VideoStreamType ) - { - if ((pClipSettings->FileType != M4VIDEOEDITING_kFileType_ARGB8888 )) { - - /** - * Read the first Video AU of the clip */ - err = pClip->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( - pClip->pReaderContext, - (M4_StreamHandler *)pClip->pVideoStream, &pClip->VideoAU); - - if( M4WAR_NO_MORE_AU == err ) - { - /** - * If we (already!) reach the end of the clip, we filter the error. - * It will be correctly managed at the first step. */ - err = M4NO_ERROR; - } - else if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1("M4VSS3GPP_intOpenClip: \ - m_pReaderDataIt->m_pFctGetNextAu() returns 0x%x!", err); - return err; - } - } else { - pClipProperties->uiVideoWidth = pClipProperties->uiStillPicWidth; - pClipProperties->uiVideoHeight = pClipProperties->uiStillPicHeight; - } - /* state check not to allocate buffer during save start */ - - - /******************************/ - /* Video resize management */ - /******************************/ - /** - * If the input clip is a rotate video or the output resolution is different - * from the input resolution, then the video frame needs to be rotated - * or resized, force to resize mode */ - if (((M4OSA_UInt32)pC->ewc.uiVideoWidth != - pClipProperties->uiVideoWidth) || - ((M4OSA_UInt32)pC->ewc.uiVideoHeight != - pClipProperties->uiVideoHeight) || - pClipProperties->videoRotationDegrees != 0) { - - if (pClip->m_pPreResizeFrame == M4OSA_NULL) { - /** - * Allocate the intermediate video plane that will - receive the decoded image before resizing */ - pClip->m_pPreResizeFrame = - (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc( - 3*sizeof(M4VIFI_ImagePlane), M4VSS3GPP, - (M4OSA_Char *)"pPreResizeFrame"); - if (M4OSA_NULL == pClip->m_pPreResizeFrame) { - M4OSA_TRACE1_0("M4MCS_intPrepareVideoEncoder(): \ - unable to allocate m_pPreResizeFrame"); - return M4ERR_ALLOC; - } - - pClip->m_pPreResizeFrame[0].pac_data = M4OSA_NULL; - pClip->m_pPreResizeFrame[1].pac_data = M4OSA_NULL; - pClip->m_pPreResizeFrame[2].pac_data = M4OSA_NULL; - - /** - * Allocate the Y plane */ - pClip->m_pPreResizeFrame[0].u_topleft = 0; - pClip->m_pPreResizeFrame[0].u_width = - pClipProperties->uiVideoWidth; - pClip->m_pPreResizeFrame[0].u_height = - pClipProperties->uiVideoHeight; - pClip->m_pPreResizeFrame[0].u_stride = - pClip->m_pPreResizeFrame[0].u_width; - - pClip->m_pPreResizeFrame[0].pac_data = - (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc ( - pClip->m_pPreResizeFrame[0].u_stride * pClip->m_pPreResizeFrame[0].u_height, - M4MCS, (M4OSA_Char *)"m_pPreResizeFrame[0].pac_data"); - if (M4OSA_NULL == pClip->m_pPreResizeFrame[0].pac_data) { - M4OSA_TRACE1_0("M4MCS_intPrepareVideoEncoder(): \ - unable to allocate m_pPreResizeFrame[0].pac_data"); - free(pClip->m_pPreResizeFrame); - return M4ERR_ALLOC; - } - - /** - * Allocate the U plane */ - pClip->m_pPreResizeFrame[1].u_topleft = 0; - pClip->m_pPreResizeFrame[1].u_width = - pClip->m_pPreResizeFrame[0].u_width >> 1; - pClip->m_pPreResizeFrame[1].u_height = - pClip->m_pPreResizeFrame[0].u_height >> 1; - pClip->m_pPreResizeFrame[1].u_stride = - pClip->m_pPreResizeFrame[1].u_width; - - pClip->m_pPreResizeFrame[1].pac_data = - (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc ( - pClip->m_pPreResizeFrame[1].u_stride * pClip->m_pPreResizeFrame[1].u_height, - M4MCS, (M4OSA_Char *)"m_pPreResizeFrame[1].pac_data"); - if (M4OSA_NULL == pClip->m_pPreResizeFrame[1].pac_data) { - M4OSA_TRACE1_0("M4MCS_intPrepareVideoEncoder(): \ - unable to allocate m_pPreResizeFrame[1].pac_data"); - free(pClip->m_pPreResizeFrame[0].pac_data); - free(pClip->m_pPreResizeFrame); - return M4ERR_ALLOC; - } - - /** - * Allocate the V plane */ - pClip->m_pPreResizeFrame[2].u_topleft = 0; - pClip->m_pPreResizeFrame[2].u_width = - pClip->m_pPreResizeFrame[1].u_width; - pClip->m_pPreResizeFrame[2].u_height = - pClip->m_pPreResizeFrame[1].u_height; - pClip->m_pPreResizeFrame[2].u_stride = - pClip->m_pPreResizeFrame[2].u_width; - - pClip->m_pPreResizeFrame[2].pac_data = - (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc ( - pClip->m_pPreResizeFrame[2].u_stride * pClip->m_pPreResizeFrame[2].u_height, - M4MCS, (M4OSA_Char *)"m_pPreResizeFrame[2].pac_data"); - if (M4OSA_NULL == pClip->m_pPreResizeFrame[2].pac_data) { - M4OSA_TRACE1_0("M4MCS_intPrepareVideoEncoder(): \ - unable to allocate m_pPreResizeFrame[2].pac_data"); - free(pClip->m_pPreResizeFrame[0].pac_data); - free(pClip->m_pPreResizeFrame[1].pac_data); - free(pClip->m_pPreResizeFrame); - return M4ERR_ALLOC; - } - } - } - - /** - * The video is currently in reading mode */ - pClip->Vstatus = M4VSS3GPP_kClipStatus_READ; - } - - if( ( M4SYS_kAudioUnknown != pC->ewc.AudioStreamType) - && (M4VIDEOEDITING_kMP3 != pClipProperties->AudioStreamType) ) - { - /** - * Read the first Audio AU of the clip */ - err = M4VSS3GPP_intClipReadNextAudioFrame(pClip); - - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intOpenClip: M4VSS3GPP_intClipReadNextAudioFrame returns 0x%x!", - err); - return err; - } - - /** - * The audio is currently in reading mode */ - pClip->Astatus = M4VSS3GPP_kClipStatus_READ; - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intOpenClip(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intComputeOutputAverageVideoBitrate() - * @brief Average bitrate of the output file, computed from input bitrates, - * durations, transitions and cuts. - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -static M4OSA_Void M4VSS3GPP_intComputeOutputAverageVideoBitrate( - M4VSS3GPP_InternalEditContext *pC ) -{ - M4VSS3GPP_ClipSettings *pCS_0, *pCS_1, *pCS_2; - M4VSS3GPP_TransitionSettings *pT0, *pT2; - M4OSA_Int32 i; - - M4OSA_UInt32 t0_duration, t2_duration; - M4OSA_UInt32 t0_bitrate, t2_bitrate; - M4OSA_UInt32 c1_duration; - - M4OSA_UInt32 total_duration; - M4OSA_UInt32 total_bitsum; - - total_duration = 0; - total_bitsum = 0; - - /* Loop on the number of clips */ - for ( i = 0; i < pC->uiClipNumber; i++ ) - { - pCS_1 = &pC->pClipList[i]; - - t0_duration = 0; - t0_bitrate = pCS_1->ClipProperties.uiVideoBitrate; - t2_duration = 0; - t2_bitrate = pCS_1->ClipProperties.uiVideoBitrate; - - /* Transition with the previous clip */ - if( i > 0 ) - { - pCS_0 = &pC->pClipList[i - 1]; - pT0 = &pC->pTransitionList[i - 1]; - - if( pT0->VideoTransitionType - != M4VSS3GPP_kVideoTransitionType_None ) - { - t0_duration = pT0->uiTransitionDuration; - - if( pCS_0->ClipProperties.uiVideoBitrate > t0_bitrate ) - { - t0_bitrate = pCS_0->ClipProperties.uiVideoBitrate; - } - } - } - - /* Transition with the next clip */ - if( i < pC->uiClipNumber - 1 ) - { - pCS_2 = &pC->pClipList[i + 1]; - pT2 = &pC->pTransitionList[i]; - - if( pT2->VideoTransitionType - != M4VSS3GPP_kVideoTransitionType_None ) - { - t2_duration = pT2->uiTransitionDuration; - - if( pCS_2->ClipProperties.uiVideoBitrate > t2_bitrate ) - { - t2_bitrate = pCS_2->ClipProperties.uiVideoBitrate; - } - } - } - - /* Check for cut times */ - if( pCS_1->uiEndCutTime > 0 ) - c1_duration = pCS_1->uiEndCutTime; - else - c1_duration = pCS_1->ClipProperties.uiClipVideoDuration; - - if( pCS_1->uiBeginCutTime > 0 ) - c1_duration -= pCS_1->uiBeginCutTime; - - c1_duration -= t0_duration + t2_duration; - - /* Compute bitsum and duration */ - total_duration += c1_duration + t0_duration / 2 + t2_duration / 2; - - total_bitsum += - c1_duration * (pCS_1->ClipProperties.uiVideoBitrate / 1000) - + (t0_bitrate / 1000) * t0_duration / 2 - + (t2_bitrate / 1000) * t2_duration / 2; - } - - pC->ewc.uiVideoBitrate = ( total_bitsum / total_duration) * 1000; -} - diff --git a/libvideoeditor/vss/src/M4VSS3GPP_EditAudio.c b/libvideoeditor/vss/src/M4VSS3GPP_EditAudio.c deleted file mode 100755 index 746883d..0000000 --- a/libvideoeditor/vss/src/M4VSS3GPP_EditAudio.c +++ /dev/null @@ -1,2013 +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 M4VSS3GPP_EditAudio.c - * @brief Video Studio Service 3GPP edit API implementation. - * @note - ****************************************************************************** - */ - -/****************/ -/*** Includes ***/ -/****************/ - -#include "NXPSW_CompilerSwitches.h" -/** - * Our header */ -#include "M4VSS3GPP_API.h" -#include "M4VSS3GPP_InternalTypes.h" -#include "M4VSS3GPP_InternalFunctions.h" -#include "M4VSS3GPP_InternalConfig.h" -#include "M4VSS3GPP_ErrorCodes.h" - -/** - * OSAL headers */ -#include "M4OSA_Memory.h" /**< OSAL memory management */ -#include "M4OSA_Debug.h" /**< OSAL debug management */ - -#define PWR_FXP_FRACT_MAX (32768) - -/************************************************************************/ -/* Static local functions */ -/************************************************************************/ -static M4OSA_ERR M4VSS3GPP_intCheckAudioMode( M4VSS3GPP_InternalEditContext - *pC ); -static M4OSA_Void M4VSS3GPP_intCheckAudioEffects( M4VSS3GPP_InternalEditContext - *pC, M4OSA_UInt8 uiClipNumber ); -static M4OSA_ERR M4VSS3GPP_intApplyAudioEffect( M4VSS3GPP_InternalEditContext - *pC, M4OSA_UInt8 uiClip1orClip2, - M4OSA_Int16 *pPCMdata, - M4OSA_UInt32 uiPCMsize ); -static M4OSA_ERR M4VSS3GPP_intAudioTransition( M4VSS3GPP_InternalEditContext - *pC, M4OSA_Int16 *pPCMdata1, - M4OSA_Int16 *pPCMdata2, - M4OSA_UInt32 uiPCMsize ); - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intEditJumpMP3() - * @brief One step of jumping processing for the MP3 clip. - * @note On one step, the jump of several AU is done - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intEditJumpMP3( M4VSS3GPP_InternalEditContext *pC ) -{ - M4OSA_ERR err; - M4VSS3GPP_ClipContext *pClip = pC->pC1; /**< shortcut */ - M4OSA_Int32 JumpCts; - - JumpCts = pClip->iActualAudioBeginCut; - - err = M4VSS3GPP_intClipJumpAudioAt(pClip, &JumpCts); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intOpenClip: M4VSS3GPP_intClipJumpAudioAt(A) returns 0x%x!", - err); - return err; - } - - if( JumpCts >= pClip->iActualAudioBeginCut ) - { - pC->State = M4VSS3GPP_kEditState_MP3; - - /** - * Update clip offset with the audio begin cut */ - pClip->iAoffset = -JumpCts; - - /** - * The audio is currently in reading mode */ - pClip->Astatus = M4VSS3GPP_kClipStatus_READ; - } - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intEditStepMP3() - * @brief One step of audio processing for the MP3 clip - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intEditStepMP3( M4VSS3GPP_InternalEditContext *pC ) -{ - M4OSA_ERR err; - M4VSS3GPP_ClipContext *pClip = pC->pC1; /**< shortcut */ - - /** - * Copy the input AU to the output AU */ - err = pC->pOsaFileWritPtr->writeData(pC->ewc.p3gpWriterContext, - pClip->pAudioFramePtr, (M4OSA_UInt32)pClip->uiAudioFrameSize); - - /** - * Read the next audio frame */ - err = M4VSS3GPP_intClipReadNextAudioFrame(pClip); - - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepMP3: READ_WRITE:\ - M4VSS3GPP_intClipReadNextAudioFrame returns 0x%x!", err); - return err; - } - else - { - /** - * Update current time (to=tc+T) */ - pC->ewc.dATo = - ( pClip->iAudioFrameCts + pClip->iAoffset) / pClip->scale_audio; - - if( (M4OSA_Int32)(pClip->iAudioFrameCts / pClip->scale_audio + 0.5) - >= pClip->iEndTime ) - { - M4READER_Buffer mp3tagBuffer; - - /** - * The duration is better respected if the first AU and last AU are both above - the cut time */ - err = pC->pOsaFileWritPtr->writeData(pC->ewc.p3gpWriterContext, - pClip->pAudioFramePtr, - (M4OSA_UInt32)pClip->uiAudioFrameSize); - - /* The ID3v1 tag is always at the end of the mp3 file so the end of the cutting - process is waited */ - /* before writing the metadata in the output file*/ - - /* Retrieve the data of the ID3v1 Tag */ - err = pClip->ShellAPI.m_pReader->m_pFctGetOption( - pClip->pReaderContext, M4READER_kOptionID_Mp3Id3v1Tag, - (M4OSA_DataOption) &mp3tagBuffer); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepMP3: M4MP3R_getOption returns 0x%x", - err); - return err; - } - - /* Write the data of the ID3v1 Tag in the output file */ - if( 0 != mp3tagBuffer.m_uiBufferSize ) - { - err = pC->pOsaFileWritPtr->writeData(pC->ewc.p3gpWriterContext, - (M4OSA_MemAddr8)mp3tagBuffer.m_pData, mp3tagBuffer.m_uiBufferSize); - /** - * Free before the error checking anyway */ - free(mp3tagBuffer.m_pData); - - /** - * Error checking */ - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepMP3:\ - pOsaFileWritPtr->writeData(ID3v1Tag) returns 0x%x", err); - return err; - } - - mp3tagBuffer.m_uiBufferSize = 0; - mp3tagBuffer.m_pData = M4OSA_NULL; - } - - /* The End Cut has been reached */ - err = M4VSS3GPP_intReachedEndOfAudio(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepMP3 : M4VSS3GPP_intReachedEndOfAudio returns 0x%x", - err); - return err; - } - } - - if( ( M4WAR_NO_MORE_AU == err) && (M4OSA_FALSE - == pC->bSupportSilence) ) /**< Reached end of clip */ - { - err = M4VSS3GPP_intReachedEndOfAudio( - pC); /**< Clip done, do the next one */ - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepMP3: READ_WRITE:\ - M4VSS3GPP_intReachedEndOfAudio returns 0x%x", - err); - return err; - } - } - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intEditStepMP3: returning M4NO_ERROR"); - return M4NO_ERROR; -} -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intEditStepAudio() - * @brief One step of audio processing - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intEditStepAudio( M4VSS3GPP_InternalEditContext *pC ) -{ - M4OSA_ERR err; - int32_t auTimeStamp = -1; - - M4ENCODER_AudioBuffer pEncInBuffer; /**< Encoder input buffer for api */ - M4ENCODER_AudioBuffer pEncOutBuffer; /**< Encoder output buffer for api */ - M4OSA_Time - frameTimeDelta; /**< Duration of the encoded (then written) data */ - M4OSA_Bool bStopAudio; - - /** - * Check if we reached end cut */ - if( ( pC->ewc.dATo - pC->pC1->iAoffset / pC->pC1->scale_audio + 0.5) - >= pC->pC1->iEndTime ) - { - /** - * Audio is done for this clip */ - err = M4VSS3GPP_intReachedEndOfAudio(pC); - - /* RC: to know when a file has been processed */ - if( M4NO_ERROR != err && err != M4VSS3GPP_WAR_SWITCH_CLIP ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: M4VSS3GPP_intReachedEndOfAudio returns 0x%x", - err); - } - - return err; - } - - /** - * Check Audio Mode, depending on the current output CTS */ - err = M4VSS3GPP_intCheckAudioMode( - pC); /**< This function change the pC->Astate variable! */ - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: M4VSS3GPP_intCheckAudioMode returns 0x%x!", - err); - return err; - } - - M4OSA_TRACE2_3(" AUDIO step : dATo = %f state = %d offset = %ld", - pC->ewc.dATo, pC->Astate, pC->pC1->iAoffset); - - bStopAudio = M4OSA_FALSE; - - switch( pC->Astate ) - { - /* _________________ */ - /*| |*/ - /*| READ_WRITE MODE |*/ - /*|_________________|*/ - - case M4VSS3GPP_kEditAudioState_READ_WRITE: - { - M4OSA_TRACE3_0("M4VSS3GPP_intEditStepAudio READ_WRITE"); - - /** - * Get the output AU to write into */ - err = pC->ShellAPI.pWriterDataFcts->pStartAU( - pC->ewc.p3gpWriterContext, M4VSS3GPP_WRITER_AUDIO_STREAM_ID, - &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio:\ - READ_WRITE: pWriterDataFcts->pStartAU returns 0x%x!", - err); - return err; - } - - /** - * Compute output audio CTS */ - pC->ewc.WriterAudioAU.CTS = - pC->pC1->iAudioFrameCts + pC->pC1->iAoffset; - - /** - * BZZZ bug fix (read-write case): - * Replace the first AMR AU of the stream with a silence AU. - * It removes annoying "BZZZ" audio glitch. - * It is not needed if there is a begin cut. - * It is not needed for the first clip. - * Because of another bugfix (2005-03-24), the first AU written may be - * the second one which CTS is 20. Hence the cts<21 test. - * (the BZZZ effect occurs even with the second AU!) */ - if( ( M4OSA_FALSE == pC->pC1->bFirstAuWritten) - && (0 != pC->uiCurrentClip) && (pC->pC1->iAudioFrameCts - < (pC->ewc.iSilenceFrameDuration + 1)) ) - { - /** - * Copy a silence AU to the output */ - pC->ewc.WriterAudioAU.size = pC->ewc.uiSilenceFrameSize; - memcpy((void *)pC->ewc.WriterAudioAU.dataAddress, - (void *)pC->ewc.pSilenceFrameData, pC->ewc.uiSilenceFrameSize); - M4OSA_TRACE2_0("A #### silence AU"); - } - else if( (M4OSA_UInt32)pC->pC1->uiAudioFrameSize - < pC->ewc.uiAudioMaxAuSize ) - { - /** - * Copy the input AU to the output AU */ - pC->ewc.WriterAudioAU.size = - (M4OSA_UInt32)pC->pC1->uiAudioFrameSize; - memcpy((void *)pC->ewc.WriterAudioAU.dataAddress, - (void *)pC->pC1->pAudioFramePtr, pC->ewc.WriterAudioAU.size); - } - else - { - M4OSA_TRACE1_2( - "M4VSS3GPP_intEditStepAudio: READ_WRITE: AU size greater than MaxAuSize \ - (%d>%d)! returning M4VSS3GPP_ERR_INPUT_AUDIO_AU_TOO_LARGE", - pC->pC1->uiAudioFrameSize, pC->ewc.uiAudioMaxAuSize); - return M4VSS3GPP_ERR_INPUT_AUDIO_AU_TOO_LARGE; - } - - /** - * This boolean is only used to fix the BZZ bug... */ - pC->pC1->bFirstAuWritten = M4OSA_TRUE; - - M4OSA_TRACE2_2("B ---- write : cts = %ld [ 0x%x ]", - (M4OSA_Int32)(pC->ewc.WriterAudioAU.CTS / pC->ewc.scale_audio), - pC->ewc.WriterAudioAU.size); - - /** - * Write the AU */ - err = pC->ShellAPI.pWriterDataFcts->pProcessAU( - pC->ewc.p3gpWriterContext, M4VSS3GPP_WRITER_AUDIO_STREAM_ID, - &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - /*11/12/2008 CR 3283 MMS use case for VideoArtist - the warning M4WAR_WRITER_STOP_REQ is returned when the targeted output file - size is reached - The editing is then finished, - the warning M4VSS3GPP_WAR_EDITING_DONE is returned*/ - if( M4WAR_WRITER_STOP_REQ == err ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intEditStepAudio: File was cut to avoid oversize"); - return M4VSS3GPP_WAR_EDITING_DONE; - } - else - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio:\ - READ_WRITE: pWriterDataFcts->pProcessAU returns 0x%x!", - err); - return err; - } - } - - /** - * Audio is now in read mode (there may be a "if(status!=READ)" here, - but it is removed for optimization) */ - pC->pC1->Astatus = M4VSS3GPP_kClipStatus_READ; - - /** - * Read the next audio frame */ - err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pC1); - - M4OSA_TRACE2_3("C .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pC1->iAudioFrameCts / pC->pC1->scale_audio, - pC->pC1->iAoffset / pC->pC1->scale_audio, - pC->pC1->uiAudioFrameSize); - - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: READ_WRITE:\ - M4VSS3GPP_intClipReadNextAudioFrame returns 0x%x!", - err); - return err; - } - else - { - /** - * Update current time (to=tc+T) */ - pC->ewc.dATo = ( pC->pC1->iAudioFrameCts + pC->pC1->iAoffset) - / pC->pC1->scale_audio; - - if( ( M4WAR_NO_MORE_AU == err) - && (M4OSA_FALSE == pC->bSupportSilence) ) - { - /** - * If output is other than AMR or AAC - (i.e. EVRC,we can't write silence into it) - * So we simply end here.*/ - bStopAudio = M4OSA_TRUE; - } - } - } - break; - - /* ____________________ */ - /*| |*/ - /*| DECODE_ENCODE MODE |*/ - /*|____________________|*/ - - case M4VSS3GPP_kEditAudioState_DECODE_ENCODE: - { - M4OSA_TRACE3_0("M4VSS3GPP_intEditStepAudio DECODE_ENCODE"); - - /** - * Get the output AU to write into */ - err = pC->ShellAPI.pWriterDataFcts->pStartAU( - pC->ewc.p3gpWriterContext, M4VSS3GPP_WRITER_AUDIO_STREAM_ID, - &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: DECODE_ENCODE:\ - pWriterDataFcts->pStartAU returns 0x%x!", - err); - return err; - } - - /** - * If we were reading the clip, we must jump a few AU backward to decode/encode - (without writing result) from that point. */ - if( M4VSS3GPP_kClipStatus_READ == pC->pC1->Astatus ) - { - M4OSA_Int32 iTargetCts, iCurrentCts; - - if( 0 - != pC->pC1-> - iAudioFrameCts ) /**<don't try to pre-decode if clip is at its beginning. */ - { - /** - * Jump a few AUs backward */ - iCurrentCts = pC->pC1->iAudioFrameCts; - iTargetCts = iCurrentCts - M4VSS3GPP_NB_AU_PREFETCH - * pC->ewc.iSilenceFrameDuration; - - if( iTargetCts < 0 ) - { - iTargetCts = 0; /**< Sanity check */ - } - - err = M4VSS3GPP_intClipJumpAudioAt(pC->pC1, &iTargetCts); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: DECODE_ENCODE-prefetch:\ - M4VSS3GPP_intClipJumpAudioAt returns 0x%x!", - err); - return err; - } - - err = M4VSS3GPP_intClipReadNextAudioFrame( - pC->pC1); /**< read AU where we jumped */ - - M4OSA_TRACE2_3("D .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pC1->iAudioFrameCts / pC->pC1->scale_audio, - pC->pC1->iAoffset / pC->pC1->scale_audio, - pC->pC1->uiAudioFrameSize); - - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: DECODE_ENCODE-prefetch:\ - M4VSS3GPP_intClipReadNextAudioFrame(a) returns 0x%x!", - err); - return err; - } - - /** - * Decode/encode up to the wanted position */ - while( pC->pC1->iAudioFrameCts < iCurrentCts ) - { - err = M4VSS3GPP_intClipDecodeCurrentAudioFrame(pC->pC1); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: DECODE_ENCODE-prefetch: \ - M4VSS3GPP_intClipDecodeCurrentAudioFrame returns 0x%x!", - err); - return err; - } - - /* [Mono] or [Stereo interleaved] : all is in one buffer */ - pEncInBuffer.pTableBuffer[0] = - pC->pC1->AudioDecBufferOut.m_dataAddress; - pEncInBuffer.pTableBufferSize[0] = - pC->pC1->AudioDecBufferOut.m_bufferSize; - pEncInBuffer.pTableBuffer[1] = M4OSA_NULL; - pEncInBuffer.pTableBufferSize[1] = 0; - - /* Time in ms from data size, because it is PCM16 samples */ - frameTimeDelta = - pEncInBuffer.pTableBufferSize[0] / sizeof(short) - / pC->ewc.uiNbChannels; - - /** - * Prepare output buffer */ - pEncOutBuffer.pTableBuffer[0] = - (M4OSA_MemAddr8)pC->ewc.WriterAudioAU.dataAddress; - pEncOutBuffer.pTableBufferSize[0] = 0; - - M4OSA_TRACE2_0("E **** pre-encode"); -#ifdef M4VSS_SUPPORT_OMX_CODECS - /*OMX Audio decoder used. - * OMX Audio dec shell does internal buffering and hence does not return - a PCM buffer for every decodeStep call.* - * So PCM buffer sizes might be 0. In this case donot call encode Step*/ - - if( 0 != pEncInBuffer.pTableBufferSize[0] ) - { -#endif - /** - * Encode the PCM audio */ - - err = - pC->ShellAPI.pAudioEncoderGlobalFcts->pFctStep( - pC->ewc.pAudioEncCtxt, - &pEncInBuffer, &pEncOutBuffer); - - if( ( M4NO_ERROR != err) - && (M4WAR_NO_MORE_AU != err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio():\ - pAudioEncoderGlobalFcts->pFctStep returns 0x%x", - err); - return err; - } -#ifdef M4VSS_SUPPORT_OMX_CODECS - - } //if(0 != pEncInBuffer.pTableBufferSize[0]) - -#endif - pC->pC1->pAudioFramePtr = M4OSA_NULL; - - // Get timestamp of last read AU - pC->pC1->ShellAPI.m_pAudioDecoder->m_pFctGetOptionAudioDec( - pC->pC1->pAudioDecCtxt, M4AD_kOptionID_AuCTS, - (M4OSA_DataOption) &auTimeStamp); - - if (auTimeStamp == -1) { - M4OSA_TRACE1_0("M4VSS3GPP_intEditStepAudio: \ - invalid audio timestamp returned"); - return M4WAR_INVALID_TIME; - } - - pC->pC1->iAudioFrameCts = auTimeStamp; - - } - } - - /** - * Audio is now OK for decoding */ - pC->pC1->Astatus = M4VSS3GPP_kClipStatus_DECODE; - } - - /** - * Decode the input audio */ - err = M4VSS3GPP_intClipDecodeCurrentAudioFrame(pC->pC1); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: DECODE_ENCODE:\ - M4VSS3GPP_intClipDecodeCurrentAudioFrame returns 0x%x", - err); - return err; - } - - pC->pC1->pAudioFramePtr = M4OSA_NULL; - - // Get timestamp of last read AU - pC->pC1->ShellAPI.m_pAudioDecoder->m_pFctGetOptionAudioDec( - pC->pC1->pAudioDecCtxt, M4AD_kOptionID_AuCTS, - (M4OSA_DataOption) &auTimeStamp); - - if (auTimeStamp == -1) { - M4OSA_TRACE1_0("M4VSS3GPP_intEditStepAudio: invalid audio \ - timestamp returned"); - return M4WAR_INVALID_TIME; - } - - pC->pC1->iAudioFrameCts = auTimeStamp; - - /** - * Apply the effect */ - if( pC->iClip1ActiveEffect >= 0 ) - { - err = M4VSS3GPP_intApplyAudioEffect(pC, 1, (M4OSA_Int16 - *)pC->pC1->AudioDecBufferOut.m_dataAddress, - pC->pC1->AudioDecBufferOut.m_bufferSize); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: DECODE_ENCODE:\ - M4VSS3GPP_intEndAudioEffect returns 0x%x", - err); - return err; - } - } - - /** - * Compute output audio CTS */ - pC->ewc.WriterAudioAU.CTS = - pC->pC1->iAudioFrameCts + pC->pC1->iAoffset; - - /* May happen with corrupted input files (which have stts entries not - multiple of SilenceFrameDuration) */ - if( pC->ewc.WriterAudioAU.CTS < 0 ) - { - pC->ewc.WriterAudioAU.CTS = 0; - } - - /** - * BZZZ bug fix (decode-encode case): - * (Yes, the Bzz bug may also occur when we re-encode. It doesn't - * occur at the decode before the encode, but at the playback!) - * Replace the first AMR AU of the encoded stream with a silence AU. - * It removes annoying "BZZZ" audio glitch. - * It is not needed if there is a begin cut. - * It is not needed for the first clip. - * Because of another bugfix (2005-03-24), the first AU written may be - * the second one which CTS is 20. Hence the cts<21 test. - * (the BZZZ effect occurs even with the second AU!) */ - if( ( M4OSA_FALSE == pC->pC1->bFirstAuWritten) - && (0 != pC->uiCurrentClip) && (pC->pC1->iAudioFrameCts - < (pC->ewc.iSilenceFrameDuration + 1)) ) - { - /** - * Copy a silence AMR AU to the output */ - pC->ewc.WriterAudioAU.size = pC->ewc.uiSilenceFrameSize; - memcpy((void *)pC->ewc.WriterAudioAU.dataAddress, - (void *)pC->ewc.pSilenceFrameData, pC->ewc.uiSilenceFrameSize); - M4OSA_TRACE2_0("G #### silence AU"); - } - else - { - /** - * Encode the filtered PCM audio directly into the output AU */ - - /* [Mono] or [Stereo interleaved] : all is in one buffer */ - pEncInBuffer.pTableBuffer[0] = - pC->pC1->AudioDecBufferOut.m_dataAddress; - pEncInBuffer.pTableBufferSize[0] = - pC->pC1->AudioDecBufferOut.m_bufferSize; - pEncInBuffer.pTableBuffer[1] = M4OSA_NULL; - pEncInBuffer.pTableBufferSize[1] = 0; - - /* Time in ms from data size, because it is PCM16 samples */ - frameTimeDelta = - pEncInBuffer.pTableBufferSize[0] / sizeof(short) - / pC->ewc.uiNbChannels; - - /** - * Prepare output buffer */ - pEncOutBuffer.pTableBuffer[0] = - (M4OSA_MemAddr8)pC->ewc.WriterAudioAU.dataAddress; - pEncOutBuffer.pTableBufferSize[0] = 0; - - M4OSA_TRACE2_0("H ++++ encode AU"); - -#ifdef M4VSS_SUPPORT_OMX_CODECS - /*OMX Audio decoder used. - * OMX Audio dec shell does internal buffering and hence does not return - a PCM buffer for every decodeStep call.* - * So PCM buffer sizes might be 0. In this case donot call encode Step*/ - - if( 0 != pEncInBuffer.pTableBufferSize[0] ) - { - -#endif - - /** - * Encode the PCM audio */ - - err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctStep( - pC->ewc.pAudioEncCtxt, - &pEncInBuffer, &pEncOutBuffer); - - if( ( M4NO_ERROR != err) && (M4WAR_NO_MORE_AU != err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio():\ - pAudioEncoderGlobalFcts->pFctStep returns 0x%x", - err); - return err; - } -#ifdef M4VSS_SUPPORT_OMX_CODECS - - } - -#endif - - /** - * Set AU size */ - - pC->ewc.WriterAudioAU.size = pEncOutBuffer.pTableBufferSize[ - 0]; /**< Get the size of encoded data */ - } - - /** - * This boolean is only used to fix the BZZ bug... */ - pC->pC1->bFirstAuWritten = M4OSA_TRUE; - - M4OSA_TRACE2_2("I ---- write : cts = %ld [ 0x%x ]", - (M4OSA_Int32)(pC->ewc.WriterAudioAU.CTS / pC->ewc.scale_audio), - pC->ewc.WriterAudioAU.size); - - /** - * Write the AU */ - err = pC->ShellAPI.pWriterDataFcts->pProcessAU( - pC->ewc.p3gpWriterContext, M4VSS3GPP_WRITER_AUDIO_STREAM_ID, - &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - /*11/12/2008 CR 3283 MMS use case for VideoArtist - the warning M4WAR_WRITER_STOP_REQ is returned when the targeted output file - size is reached - The editing is then finished, - the warning M4VSS3GPP_WAR_EDITING_DONE is returned*/ - if( M4WAR_WRITER_STOP_REQ == err ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intEditStepAudio: File was cut to avoid oversize"); - return M4VSS3GPP_WAR_EDITING_DONE; - } - else - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: DECODE_ENCODE:\ - pWriterDataFcts->pProcessAU returns 0x%x!", - err); - return err; - } - } - - /** - * Read the next audio frame */ - err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pC1); - - M4OSA_TRACE2_3("J .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pC1->iAudioFrameCts / pC->pC1->scale_audio, - pC->pC1->iAoffset / pC->pC1->scale_audio, - pC->pC1->uiAudioFrameSize); - - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: DECODE_ENCODE:\ - M4VSS3GPP_intClipReadNextAudioFrame returns 0x%x!", - err); - return err; - } - else - { - /** - * Update current time (to=tc+T) */ - pC->ewc.dATo = ( pC->pC1->iAudioFrameCts + pC->pC1->iAoffset) - / pC->pC1->scale_audio; - - if( ( M4WAR_NO_MORE_AU == err) - && (M4OSA_FALSE == pC->bSupportSilence) ) - { - /** - * If output is other than AMR or AAC - (i.e. EVRC,we can't write silence into it) - * So we simply end here.*/ - bStopAudio = M4OSA_TRUE; - } - } - } - break; - - /* _________________ */ - /*| |*/ - /*| TRANSITION MODE |*/ - /*|_________________|*/ - - case M4VSS3GPP_kEditAudioState_TRANSITION: - { - M4OSA_TRACE3_0("M4VSS3GPP_intEditStepAudio TRANSITION"); - - /** - * Get the output AU to write into */ - err = pC->ShellAPI.pWriterDataFcts->pStartAU( - pC->ewc.p3gpWriterContext, M4VSS3GPP_WRITER_AUDIO_STREAM_ID, - &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: TRANSITION:\ - pWriterDataFcts->pStartAU returns 0x%x!", - err); - return err; - } - - /** - * If we were reading the clip, we must jump a few AU backward to decode/encode - (without writing result) from that point. */ - if( M4VSS3GPP_kClipStatus_READ == pC->pC1->Astatus ) - { - M4OSA_Int32 iTargetCts, iCurrentCts; - - if( 0 - != pC->pC1-> - iAudioFrameCts ) /**<don't try to pre-decode if clip is at its beginning.*/ - { - /** - * Jump a few AUs backward */ - iCurrentCts = pC->pC1->iAudioFrameCts; - iTargetCts = iCurrentCts - M4VSS3GPP_NB_AU_PREFETCH - * pC->ewc.iSilenceFrameDuration; - - if( iTargetCts < 0 ) - { - iTargetCts = 0; /**< Sanity check */ - } - - err = M4VSS3GPP_intClipJumpAudioAt(pC->pC1, &iTargetCts); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: TRANSITION-prefetch:\ - M4VSS3GPP_intClipJumpAudioAt returns 0x%x!", - err); - return err; - } - - err = M4VSS3GPP_intClipReadNextAudioFrame( - pC->pC1); /**< read AU where we jumped */ - - M4OSA_TRACE2_3("K .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pC1->iAudioFrameCts / pC->pC1->scale_audio, - pC->pC1->iAoffset / pC->pC1->scale_audio, - pC->pC1->uiAudioFrameSize); - - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: TRANSITION-prefetch:\ - M4VSS3GPP_intClipReadNextAudioFrame(a) returns 0x%x!", - err); - return err; - } - - /** - * Decode/encode up to the wanted position */ - while( pC->pC1->iAudioFrameCts < iCurrentCts ) - { - err = M4VSS3GPP_intClipDecodeCurrentAudioFrame(pC->pC1); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: TRANSITION-prefetch:\ - M4VSS3GPP_intClipDecodeCurrentAudioFrame returns 0x%x!", - err); - return err; - } - - /* [Mono] or [Stereo interleaved] : all is in one buffer */ - pEncInBuffer.pTableBuffer[0] = - pC->pC1->AudioDecBufferOut.m_dataAddress; - pEncInBuffer.pTableBufferSize[0] = - pC->pC1->AudioDecBufferOut.m_bufferSize; - pEncInBuffer.pTableBuffer[1] = M4OSA_NULL; - pEncInBuffer.pTableBufferSize[1] = 0; - - /* Time in ms from data size, because it is PCM16 samples */ - frameTimeDelta = - pEncInBuffer.pTableBufferSize[0] / sizeof(short) - / pC->ewc.uiNbChannels; - - /** - * Prepare output buffer */ - pEncOutBuffer.pTableBuffer[0] = - (M4OSA_MemAddr8)pC->ewc.WriterAudioAU.dataAddress; - pEncOutBuffer.pTableBufferSize[0] = 0; - - M4OSA_TRACE2_0("L **** pre-encode"); -#ifdef M4VSS_SUPPORT_OMX_CODECS - /*OMX Audio decoder used. - * OMX Audio dec shell does internal buffering and hence does not return - a PCM buffer for every decodeStep call.* - * So PCM buffer sizes might be 0. In this case donot call encode Step*/ - - if( 0 != pEncInBuffer.pTableBufferSize[0] ) - { - -#endif - /** - * Encode the PCM audio */ - - err = - pC->ShellAPI.pAudioEncoderGlobalFcts->pFctStep( - pC->ewc.pAudioEncCtxt, - &pEncInBuffer, &pEncOutBuffer); - - if( ( M4NO_ERROR != err) - && (M4WAR_NO_MORE_AU != err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio():\ - pAudioEncoderGlobalFcts->pFctStep returns 0x%x", - err); - return err; - } -#ifdef M4VSS_SUPPORT_OMX_CODECS - - } - -#endif - - err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pC1); - - M4OSA_TRACE2_3( - "M .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pC1->iAudioFrameCts / pC->pC1->scale_audio, - pC->pC1->iAoffset / pC->pC1->scale_audio, - pC->pC1->uiAudioFrameSize); - - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: TRANSITION-prefetch:\ - M4VSS3GPP_intClipReadNextAudioFrame(b) returns 0x%x!", - err); - return err; - } - } - } - - /** - * Audio is now OK for decoding */ - pC->pC1->Astatus = M4VSS3GPP_kClipStatus_DECODE; - } - - /** - * Decode the first input audio */ - err = M4VSS3GPP_intClipDecodeCurrentAudioFrame(pC->pC1); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: TRANSITION:\ - M4VSS3GPP_intClipDecodeCurrentAudioFrame(C1) returns 0x%x", - err); - return err; - } - - /** - * Decode the second input audio */ - err = M4VSS3GPP_intClipDecodeCurrentAudioFrame(pC->pC2); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: TRANSITION:\ - M4VSS3GPP_intClipDecodeCurrentAudioFrame(C2) returns 0x%x", - err); - return err; - } - - /** - * Check both clips decoded the same amount of PCM samples */ - if( pC->pC1->AudioDecBufferOut.m_bufferSize - != pC->pC2->AudioDecBufferOut.m_bufferSize ) - { - M4OSA_TRACE1_2( - "ERR : AudioTransition: both clips AU must have the same decoded\ - PCM size! pc1 size=0x%x, pC2 size = 0x%x", - pC->pC1->AudioDecBufferOut.m_bufferSize, - pC->pC2->AudioDecBufferOut.m_bufferSize); -#ifdef M4VSS_SUPPORT_OMX_CODECS - /*OMX Audio decoder used. - * OMX Audio dec shell does internal buffering and hence does not return - a PCM buffer for every decodeStep call.* - * So PCM buffer sizes might be 0 or different for clip1 and clip2. - * So no need to return error in this case */ - - M4OSA_TRACE1_2( - "M4VSS3GPP_intEditStepAudio: , pc1 AudBuff size=0x%x,\ - pC2 AudBuff size = 0x%x", - pC->pC1->AudioDecBufferOut.m_bufferSize, - pC->pC2->AudioDecBufferOut.m_bufferSize); - -#else - - return M4VSS3GPP_ERR_AUDIO_DECODED_PCM_SIZE_ISSUE; - -#endif // M4VSS_SUPPORT_OMX_CODECS - - } - - /** - * Apply the audio effect on clip1 */ - if( pC->iClip1ActiveEffect >= 0 ) - { - err = M4VSS3GPP_intApplyAudioEffect(pC, 1, (M4OSA_Int16 - *)pC->pC1->AudioDecBufferOut.m_dataAddress, - pC->pC1->AudioDecBufferOut.m_bufferSize); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: TRANSITION:\ - M4VSS3GPP_intApplyAudioEffect(C1) returns 0x%x", - err); - return err; - } - } - - /** - * Apply the audio effect on clip2 */ - if( pC->iClip2ActiveEffect >= 0 ) - { - err = M4VSS3GPP_intApplyAudioEffect(pC, 2, (M4OSA_Int16 - *)pC->pC2->AudioDecBufferOut.m_dataAddress, - pC->pC2->AudioDecBufferOut.m_bufferSize); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: TRANSITION:\ - M4VSS3GPP_intApplyAudioEffect(C2) returns 0x%x", - err); - return err; - } - } - - /** - * Apply the transition effect */ - err = M4VSS3GPP_intAudioTransition(pC, - (M4OSA_Int16 *)pC->pC1->AudioDecBufferOut.m_dataAddress, - (M4OSA_Int16 *)pC->pC2->AudioDecBufferOut.m_dataAddress, - pC->pC1->AudioDecBufferOut.m_bufferSize); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: TRANSITION:\ - M4VSS3GPP_intAudioTransition returns 0x%x", - err); - return err; - } - - /* [Mono] or [Stereo interleaved] : all is in one buffer */ - pEncInBuffer.pTableBuffer[0] = - pC->pC1->AudioDecBufferOut.m_dataAddress; - pEncInBuffer.pTableBufferSize[0] = - pC->pC1->AudioDecBufferOut.m_bufferSize; - pEncInBuffer.pTableBuffer[1] = M4OSA_NULL; - pEncInBuffer.pTableBufferSize[1] = 0; - - /* Time in ms from data size, because it is PCM16 samples */ - frameTimeDelta = pEncInBuffer.pTableBufferSize[0] / sizeof(short) - / pC->ewc.uiNbChannels; - - /** - * Prepare output buffer */ - pEncOutBuffer.pTableBuffer[0] = - (M4OSA_MemAddr8)pC->ewc.WriterAudioAU.dataAddress; - pEncOutBuffer.pTableBufferSize[0] = 0; - - M4OSA_TRACE2_0("N **** blend AUs"); - -#ifdef M4VSS_SUPPORT_OMX_CODECS - /*OMX Audio decoder used. - * OMX Audio dec shell does internal buffering and hence does not return - a PCM buffer for every decodeStep call.* - * So PCM buffer sizes might be 0. In this case donot call encode Step*/ - - if( 0 != pEncInBuffer.pTableBufferSize[0] ) - { - -#endif - - /** - * Encode the PCM audio */ - - err = pC->ShellAPI.pAudioEncoderGlobalFcts->pFctStep( - pC->ewc.pAudioEncCtxt, &pEncInBuffer, &pEncOutBuffer); - - if( ( M4NO_ERROR != err) && (M4WAR_NO_MORE_AU != err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio():\ - pAudioEncoderGlobalFcts->pFctStep returns 0x%x", - err); - return err; - } -#ifdef M4VSS_SUPPORT_OMX_CODECS - - } - -#endif - - /** - * Set AU cts and size */ - - pC->ewc.WriterAudioAU.size = pEncOutBuffer.pTableBufferSize[ - 0]; /**< Get the size of encoded data */ - pC->ewc.WriterAudioAU.CTS += frameTimeDelta; - - M4OSA_TRACE2_2("O ---- write : cts = %ld [ 0x%x ]", - (M4OSA_Int32)(pC->ewc.WriterAudioAU.CTS / pC->ewc.scale_audio), - pC->ewc.WriterAudioAU.size); - - /** - * Write the AU */ - err = pC->ShellAPI.pWriterDataFcts->pProcessAU( - pC->ewc.p3gpWriterContext, M4VSS3GPP_WRITER_AUDIO_STREAM_ID, - &pC->ewc.WriterAudioAU); - - if( M4NO_ERROR != err ) - { - /*11/12/2008 CR 3283 MMS use case for VideoArtist - the warning M4WAR_WRITER_STOP_REQ is returned when the targeted output - file size is reached - The editing is then finished,the warning M4VSS3GPP_WAR_EDITING_DONE - is returned*/ - if( M4WAR_WRITER_STOP_REQ == err ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intEditStepAudio: File was cut to avoid oversize"); - return M4VSS3GPP_WAR_EDITING_DONE; - } - else - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: TRANSITION:\ - pWriterDataFcts->pProcessAU returns 0x%x!", - err); - return err; - } - } - - /** - * Read the next audio frame */ - err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pC1); - - M4OSA_TRACE2_3("P .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pC1->iAudioFrameCts / pC->pC1->scale_audio, - pC->pC1->iAoffset / pC->pC1->scale_audio, - pC->pC1->uiAudioFrameSize); - - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: TRANSITION:\ - M4VSS3GPP_intClipReadNextAudioFrame(C1) returns 0x%x!", - err); - return err; - } - else - { - M4OSA_ERR secondaryError; - - /** - * Update current time (to=tc+T) */ - pC->ewc.dATo = ( pC->pC1->iAudioFrameCts + pC->pC1->iAoffset) - / pC->pC1->scale_audio; - - /** - * Read the next audio frame in the second clip */ - secondaryError = M4VSS3GPP_intClipReadNextAudioFrame(pC->pC2); - - M4OSA_TRACE2_3("Q .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pC2->iAudioFrameCts / pC->pC2->scale_audio, - pC->pC2->iAoffset / pC->pC2->scale_audio, - pC->pC2->uiAudioFrameSize); - - if( M4OSA_ERR_IS_ERROR(secondaryError) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: TRANSITION:\ - M4VSS3GPP_intClipReadNextAudioFrame(C2) returns 0x%x!", - secondaryError); - return err; - } - - if( ( ( M4WAR_NO_MORE_AU == err) - || (M4WAR_NO_MORE_AU == secondaryError)) - && (M4OSA_FALSE == pC->bSupportSilence) ) - { - /** - * If output is other than AMR or AAC - (i.e. EVRC,we can't write silence into it) - * So we simply end here.*/ - bStopAudio = M4OSA_TRUE; - } - } - } - break; - - /* ____________ */ - /*| |*/ - /*| ERROR CASE |*/ - /*|____________|*/ - - default: - - M4OSA_TRACE3_1( - "M4VSS3GPP_intEditStepAudio: invalid internal state (0x%x), \ - returning M4VSS3GPP_ERR_INTERNAL_STATE", - pC->Astate); - return M4VSS3GPP_ERR_INTERNAL_STATE; - } - - /** - * Check if we are forced to stop audio */ - if( M4OSA_TRUE == bStopAudio ) - { - /** - * Audio is done for this clip */ - err = M4VSS3GPP_intReachedEndOfAudio(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepAudio: M4VSS3GPP_intReachedEndOfAudio returns 0x%x", - err); - return err; - } - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intEditStepAudio: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intCheckAudioMode() - * @brief Check which audio process mode we must use, depending on the output CTS. - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intCheckAudioMode( M4VSS3GPP_InternalEditContext - *pC ) -{ - M4OSA_ERR err; - const M4OSA_Int32 TD = pC->pTransitionList[pC-> - uiCurrentClip].uiTransitionDuration; /**< Transition duration */ - - const M4VSS3GPP_EditAudioState previousAstate = pC->Astate; - - /** - * Check if Clip1 is on its begin cut, or in its begin effect or end effect zone */ - M4VSS3GPP_intCheckAudioEffects(pC, 1); - - /** - * Check if we are in the transition with next clip */ - if( ( TD > 0) && ((M4OSA_Int32)(pC->ewc.dATo - pC->pC1->iAoffset - / pC->pC1->scale_audio + 0.5) >= (pC->pC1->iEndTime - TD)) ) - { - /** - * We are in a transition */ - pC->Astate = M4VSS3GPP_kEditAudioState_TRANSITION; - pC->bTransitionEffect = M4OSA_TRUE; - - /** - * Do we enter the transition section ? */ - if( M4VSS3GPP_kEditAudioState_TRANSITION != previousAstate ) - { - /** - * Open second clip for transition, if not yet opened */ - if( M4OSA_NULL == pC->pC2 ) - { - err = M4VSS3GPP_intOpenClip(pC, &pC->pC2, - &pC->pClipList[pC->uiCurrentClip + 1]); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCheckAudioMode: M4VSS3GPP_intOpenClip() returns 0x%x!", - err); - return err; - } - - /** - * In case of short transition and bad luck (...), there may be no video AU - * in the transition. In that case, the second clip has not been opened. - * So we must update the video offset here. */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - /**< Add current video output CTS to the clip offset */ - pC->pC2->iVoffset += (M4OSA_UInt32)pC->ewc.dInputVidCts; - } - - /** - * Add current audio output CTS to the clip offset - * (video offset has already been set when doing the video transition) */ - pC->pC2->iAoffset += - (M4OSA_UInt32)(pC->ewc.dATo * pC->ewc.scale_audio + 0.5); - - /** - * 2005-03-24: BugFix for audio-video synchro: - * There may be a portion of the duration of an audio AU of desynchro at each assembly. - * It leads to an audible desynchro when there are a lot of clips assembled. - * This bug fix allows to resynch the audio track when the delta is higher - * than one audio AU duration. - * We Step one AU in the second clip and we change the audio offset accordingly. */ - if( ( pC->pC2->iAoffset - - (M4OSA_Int32)(pC->pC2->iVoffset *pC->pC2->scale_audio + 0.5)) - > pC->ewc.iSilenceFrameDuration ) - { - /** - * Advance one AMR frame */ - err = M4VSS3GPP_intClipReadNextAudioFrame(pC->pC2); - - M4OSA_TRACE2_3("Z .... read : cts = %.0f + %.0f [ 0x%x ]", - pC->pC2->iAudioFrameCts / pC->pC2->scale_audio, - pC->pC2->iAoffset / pC->pC2->scale_audio, - pC->pC2->uiAudioFrameSize); - - if( M4OSA_ERR_IS_ERROR(err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCheckAudioMode:\ - M4VSS3GPP_intClipReadNextAudioFrame returns 0x%x!", - err); - return err; - } - /** - * Update audio offset accordingly*/ - pC->pC2->iAoffset -= pC->ewc.iSilenceFrameDuration; - } - } - - /** - * Check begin and end effects for clip2 */ - M4VSS3GPP_intCheckAudioEffects(pC, 2); - } - else - { - /** - * We are not in a transition */ - pC->bTransitionEffect = M4OSA_FALSE; - - /** - * Check if current mode is Read/Write or Decode/Encode */ - if( pC->iClip1ActiveEffect >= 0 ) - { - pC->Astate = M4VSS3GPP_kEditAudioState_DECODE_ENCODE; - } - else - { - pC->Astate = M4VSS3GPP_kEditAudioState_READ_WRITE; - } - } - - /** - * Check if we create/destroy an encoder */ - if( ( M4VSS3GPP_kEditAudioState_READ_WRITE == previousAstate) - && /**< read mode */ - (M4VSS3GPP_kEditAudioState_READ_WRITE != pC->Astate) ) /**< encode mode */ - { - M4OSA_UInt32 uiAudioBitrate; - - /* Compute max bitrate depending on input files bitrates and transitions */ - if( pC->Astate == M4VSS3GPP_kEditAudioState_TRANSITION ) - { - /* Max of the two blended files */ - if( pC->pC1->pSettings->ClipProperties.uiAudioBitrate - > pC->pC2->pSettings->ClipProperties.uiAudioBitrate ) - uiAudioBitrate = - pC->pC1->pSettings->ClipProperties.uiAudioBitrate; - else - uiAudioBitrate = - pC->pC2->pSettings->ClipProperties.uiAudioBitrate; - } - else - { - /* Same as input file */ - uiAudioBitrate = pC->pC1->pSettings->ClipProperties.uiAudioBitrate; - } - - /** - * Create the encoder */ - err = M4VSS3GPP_intCreateAudioEncoder(&pC->ewc, &pC->ShellAPI, - uiAudioBitrate); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCheckAudioMode: M4VSS3GPP_intResetAudioEncoder() returns 0x%x!", - err); - return err; - } - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intCheckAudioMode(): returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_Void M4VSS3GPP_intCheckAudioEffects() - * @brief Check which audio effect must be applied at the current time - ****************************************************************************** - */ -static M4OSA_Void M4VSS3GPP_intCheckAudioEffects( M4VSS3GPP_InternalEditContext - *pC, M4OSA_UInt8 uiClipNumber ) -{ - M4OSA_UInt8 uiClipIndex; - M4OSA_UInt8 uiFxIndex; - M4VSS3GPP_ClipContext *pClip; - M4VSS3GPP_EffectSettings *pFx; - M4OSA_Int32 BC, EC; - M4OSA_Int8 *piClipActiveEffect; - M4OSA_Int32 t; - - if( 1 == uiClipNumber ) - { - uiClipIndex = pC->uiCurrentClip; - pClip = pC->pC1; - piClipActiveEffect = &(pC->iClip1ActiveEffect); - } - else /**< (2 == uiClipNumber) */ - { - uiClipIndex = pC->uiCurrentClip + 1; - pClip = pC->pC2; - piClipActiveEffect = &(pC->iClip2ActiveEffect); - } - - /** - * Shortcuts for code readability */ - BC = pClip->iActualAudioBeginCut; - EC = pClip->iEndTime; - - /** - Change the absolut time to clip related time - RC t = (M4OSA_Int32)(pC->ewc.dATo - pClip->iAoffset/pClip->scale_audio + 0.5); - < rounding */; - t = (M4OSA_Int32)(pC->ewc.dATo/*- pClip->iAoffset/pClip->scale_audio*/ - + 0.5); /**< rounding */ - ; - - /** - * Default: no effect active */ - *piClipActiveEffect = -1; - - /** - * Check the three effects */ - // RC for (uiFxIndex=0; uiFxIndex<pC->pClipList[uiClipIndex].nbEffects; uiFxIndex++) - for ( uiFxIndex = 0; uiFxIndex < pC->nbEffects; uiFxIndex++ ) - { - /** Shortcut, reverse order because of priority between effects - ( EndEffect always clean ) */ - pFx = &(pC->pEffectsList[pC->nbEffects - 1 - uiFxIndex]); - - if( M4VSS3GPP_kAudioEffectType_None != pFx->AudioEffectType ) - { - /** - * Check if there is actually a video effect */ - if( ( t >= (M4OSA_Int32)(/*BC +*/pFx->uiStartTime)) - && /**< Are we after the start time of the effect? */ - (t < (M4OSA_Int32)(/*BC +*/pFx->uiStartTime + pFx-> - uiDuration)) ) /**< Are we into the effect duration? */ - { - /** - * Set the active effect */ - *piClipActiveEffect = pC->nbEffects - 1 - uiFxIndex; - - /** - * The first effect has the highest priority, then the second one, - then the thirs one. - * Hence, as soon as we found an active effect, we can get out of this loop */ - uiFxIndex = pC->nbEffects; /** get out of the for loop */ - } - /** - * Bugfix: The duration of the end effect has been set according to the - announced clip duration. - * If the announced duration is smaller than the real one, the end effect - won't be applied at - * the very end of the clip. To solve this issue we force the end effect. */ - - } - } - - return; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intApplyAudioEffect() - * @brief Apply audio effect to pPCMdata - * @param pC (IN/OUT) Internal edit context - * @param uiClip1orClip2 (IN/OUT) 1 for first clip, 2 for second clip - * @param pPCMdata (IN/OUT) Input and Output PCM audio data - * @param uiPCMsize (IN) Size of pPCMdata - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intApplyAudioEffect( M4VSS3GPP_InternalEditContext - *pC, M4OSA_UInt8 uiClip1orClip2, - M4OSA_Int16 *pPCMdata, - M4OSA_UInt32 uiPCMsize ) -{ - M4VSS3GPP_ClipContext *pClip; - M4VSS3GPP_ClipSettings *pClipSettings; - M4VSS3GPP_EffectSettings *pFx; - M4OSA_Int32 - i32sample; /**< we will cast each Int16 sample into this Int32 variable */ - M4OSA_Int32 iPos; - M4OSA_Int32 iDur; - - M4OSA_DEBUG_IF2(( 1 != uiClip1orClip2) && (2 != uiClip1orClip2), - M4ERR_PARAMETER, - "M4VSS3GPP_intBeginAudioEffect: uiClip1orClip2 invalid"); - - if( 1 == uiClip1orClip2 ) - { - pClip = pC->pC1; - pClipSettings = &(pC->pClipList[pC-> - uiCurrentClip]); /**< Get a shortcut to the clip settings */ - // RC pFx = &(pClipSettings->Effects[pC->iClip1ActiveEffect]);/**< Get a shortcut - // to the active effect */ - pFx = &(pC-> - pEffectsList[pC-> - iClip1ActiveEffect]); /**< Get a shortcut to the active effect */ - M4OSA_DEBUG_IF2(( pC->iClip1ActiveEffect < 0) - || (pC->iClip1ActiveEffect > 2), M4ERR_PARAMETER, - "M4VSS3GPP_intApplyAudioEffect: iClip1ActiveEffect invalid"); - } - else /**< if (2==uiClip1orClip2) */ - { - pClip = pC->pC2; - pClipSettings = &(pC->pClipList[pC->uiCurrentClip - + 1]); /**< Get a shortcut to the clip settings */ - // RC pFx = &(pClipSettings->Effects[pC->iClip2ActiveEffect]);/**< Get a shortcut - // to the active effect */ - pFx = &(pC-> - pEffectsList[pC-> - iClip2ActiveEffect]); /**< Get a shortcut to the active effect */ - M4OSA_DEBUG_IF2(( pC->iClip2ActiveEffect < 0) - || (pC->iClip2ActiveEffect > 2), M4ERR_PARAMETER, - "M4VSS3GPP_intApplyAudioEffect: iClip2ActiveEffect invalid"); - } - - iDur = (M4OSA_Int32)pFx->uiDuration; - - /** - * Compute how far from the beginning of the effect we are, in clip-base time. - * It is done with integers because the offset and begin cut have been rounded already. */ - iPos = - (M4OSA_Int32)(pC->ewc.dATo + 0.5 - pClip->iAoffset / pClip->scale_audio) - - pClip->iActualAudioBeginCut - pFx->uiStartTime; - - /** - * Sanity check */ - if( iPos > iDur ) - { - iPos = iDur; - } - else if( iPos < 0 ) - { - iPos = 0; - } - - /** - * At this point, iPos is the effect progress, in a 0 to iDur base */ - switch( pFx->AudioEffectType ) - { - case M4VSS3GPP_kAudioEffectType_FadeIn: - - /** - * Original samples are signed 16bits. - * We convert it to signed 32bits and multiply it by iPos. - * So we must assure that iPos is not higher that 16bits max. - * iPos max value is iDur, so we test iDur. */ - while( iDur > PWR_FXP_FRACT_MAX ) - { - iDur >>= - 2; /**< divide by 2 would be more logical (instead of 4), - but we have enough dynamic..) */ - iPos >>= 2; /**< idem */ - } - - /** - * From buffer size (bytes) to number of sample (int16): divide by two */ - uiPCMsize >>= 1; - - /** - * Loop on samples */ - while( uiPCMsize-- > 0 ) /**< decrementing to optimize */ - { - i32sample = *pPCMdata; - i32sample *= iPos; - i32sample /= iDur; - *pPCMdata++ = (M4OSA_Int16)i32sample; - } - - break; - - case M4VSS3GPP_kAudioEffectType_FadeOut: - - /** - * switch from 0->Dur to Dur->0 in order to do fadeOUT instead of fadeIN */ - iPos = iDur - iPos; - - /** - * Original samples are signed 16bits. - * We convert it to signed 32bits and multiply it by iPos. - * So we must assure that iPos is not higher that 16bits max. - * iPos max value is iDur, so we test iDur. */ - while( iDur > PWR_FXP_FRACT_MAX ) - { - iDur >>= - 2; /**< divide by 2 would be more logical (instead of 4), - but we have enough dynamic..) */ - iPos >>= 2; /**< idem */ - } - - /** - * From buffer size (bytes) to number of sample (int16): divide by two */ - uiPCMsize >>= 1; - - /** - * Loop on samples, apply the fade factor on each */ - while( uiPCMsize-- > 0 ) /**< decrementing counter to optimize */ - { - i32sample = *pPCMdata; - i32sample *= iPos; - i32sample /= iDur; - *pPCMdata++ = (M4OSA_Int16)i32sample; - } - - break; - - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_intApplyAudioEffect: unknown audio effect type (0x%x),\ - returning M4VSS3GPP_ERR_INVALID_AUDIO_EFFECT_TYPE", - pFx->AudioEffectType); - return M4VSS3GPP_ERR_INVALID_AUDIO_EFFECT_TYPE; - } - - /** - * Return */ - M4OSA_TRACE3_0("M4VSS3GPP_intApplyAudioEffect: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAudioTransition() - * @brief Apply transition effect to two PCM buffer - * @note The result of the transition is put in the first buffer. - * I know it's not beautiful, but it fits my current needs, and it's efficient! - * So why bother with a third output buffer? - * @param pC (IN/OUT) Internal edit context - * @param pPCMdata1 (IN/OUT) First input and Output PCM audio data - * @param pPCMdata2 (IN) Second input PCM audio data - * @param uiPCMsize (IN) Size of both PCM buffers - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intAudioTransition( M4VSS3GPP_InternalEditContext - *pC, M4OSA_Int16 *pPCMdata1, - M4OSA_Int16 *pPCMdata2, - M4OSA_UInt32 uiPCMsize ) -{ - M4OSA_Int32 i32sample1, - i32sample2; /**< we will cast each Int16 sample into this Int32 variable */ - M4OSA_Int32 iPos1, iPos2; - M4OSA_Int32 iDur = (M4OSA_Int32)pC-> - pTransitionList[pC->uiCurrentClip].uiTransitionDuration; - - /** - * Compute how far from the end cut we are, in clip-base time. - * It is done with integers because the offset and begin cut have been rounded already. */ - iPos1 = pC->pC1->iEndTime - (M4OSA_Int32)(pC->ewc.dATo - + 0.5 - pC->pC1->iAoffset / pC->pC1->scale_audio); - - /** - * Sanity check */ - if( iPos1 > iDur ) - { - iPos1 = iDur; - } - else if( iPos1 < 0 ) - { - iPos1 = 0; - } - - /** - * Position of second clip in the transition */ - iPos2 = iDur - iPos1; - - /** - * At this point, iPos2 is the transition progress, in a 0 to iDur base. - * iPos1 is the transition progress, in a iDUr to 0 base. */ - switch( pC->pTransitionList[pC->uiCurrentClip].AudioTransitionType ) - { - case M4VSS3GPP_kAudioTransitionType_CrossFade: - - /** - * Original samples are signed 16bits. - * We convert it to signed 32bits and multiply it by iPos. - * So we must assure that iPos is not higher that 16bits max. - * iPos max value is iDur, so we test iDur. */ - while( iDur > PWR_FXP_FRACT_MAX ) - { - iDur >>= - 2; /**< divide by 2 would be more logical (instead of 4), - but we have enough dynamic..) */ - iPos1 >>= 2; /**< idem */ - iPos2 >>= 2; /**< idem */ - } - - /** - * From buffer size (bytes) to number of sample (int16): divide by two */ - uiPCMsize >>= 1; - - /** - * Loop on samples, apply the fade factor on each */ - while( uiPCMsize-- > 0 ) /**< decrementing counter to optimize */ - { - i32sample1 = *pPCMdata1; /**< Get clip1 sample */ - i32sample1 *= iPos1; /**< multiply by fade numerator */ - i32sample1 /= iDur; /**< divide by fade denominator */ - - i32sample2 = *pPCMdata2; /**< Get clip2 sample */ - i32sample2 *= iPos2; /**< multiply by fade numerator */ - i32sample2 /= iDur; /**< divide by fade denominator */ - - *pPCMdata1++ = (M4OSA_Int16)(i32sample1 - + i32sample2); /**< mix the two samples */ - pPCMdata2++; /**< don't forget to increment the second buffer */ - } - break; - - case M4VSS3GPP_kAudioTransitionType_None: - /** - * This is a stupid-non optimized version of the None transition... - * We copy the PCM frames */ - if( iPos1 < (iDur >> 1) ) /**< second half of transition */ - { - /** - * Copy the input PCM to the output buffer */ - memcpy((void *)pPCMdata1, - (void *)pPCMdata2, uiPCMsize); - } - /** - * the output must be put in the first buffer. - * For the first half of the non-transition it's already the case! - * So we have nothing to do here... - */ - - break; - - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_intAudioTransition: unknown transition type (0x%x),\ - returning M4VSS3GPP_ERR_INVALID_AUDIO_TRANSITION_TYPE", - pC->pTransitionList[pC->uiCurrentClip].AudioTransitionType); - return M4VSS3GPP_ERR_INVALID_AUDIO_TRANSITION_TYPE; - } - - /** - * Return */ - M4OSA_TRACE3_0("M4VSS3GPP_intAudioTransition: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intCreateAudioEncoder() - * @brief Reset the audio encoder (Create it if needed) - * @note - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intCreateAudioEncoder( M4VSS3GPP_EncodeWriteContext *pC_ewc, - M4VSS3GPP_MediaAndCodecCtxt *pC_ShellAPI, - M4OSA_UInt32 uiAudioBitrate ) -{ - M4OSA_ERR err; - - /** - * If an encoder already exist, we destroy it */ - if( M4OSA_NULL != pC_ewc->pAudioEncCtxt ) - { - err = pC_ShellAPI->pAudioEncoderGlobalFcts->pFctClose( - pC_ewc->pAudioEncCtxt); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intResetAudioEncoder: pAudioEncoderGlobalFcts->pFctClose returns 0x%x", - err); - /**< don't return, we still have stuff to free */ - } - - err = pC_ShellAPI->pAudioEncoderGlobalFcts->pFctCleanUp( - pC_ewc->pAudioEncCtxt); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intResetAudioEncoder:\ - pAudioEncoderGlobalFcts->pFctCleanUp returns 0x%x", err); - /**< don't return, we still have stuff to free */ - } - - pC_ewc->pAudioEncCtxt = M4OSA_NULL; - } - - /** - * Creates a new encoder */ - switch( pC_ewc->AudioStreamType ) - { - //EVRC - // case M4SYS_kEVRC: - // - // err = M4VSS3GPP_setCurrentAudioEncoder(&pC->ShellAPI, - // pC_ewc->AudioStreamType); - // M4ERR_CHECK_RETURN(err); - // - // pC_ewc->AudioEncParams.Format = M4ENCODER_kEVRC; - // pC_ewc->AudioEncParams.Frequency = M4ENCODER_k8000Hz; - // pC_ewc->AudioEncParams.ChannelNum = M4ENCODER_kMono; - // pC_ewc->AudioEncParams.Bitrate = M4VSS3GPP_EVRC_DEFAULT_BITRATE; - // break; - - case M4SYS_kAMR: - - err = M4VSS3GPP_setCurrentAudioEncoder(pC_ShellAPI, - pC_ewc->AudioStreamType); - M4ERR_CHECK_RETURN(err); - - pC_ewc->AudioEncParams.Format = M4ENCODER_kAMRNB; - pC_ewc->AudioEncParams.Frequency = M4ENCODER_k8000Hz; - pC_ewc->AudioEncParams.ChannelNum = M4ENCODER_kMono; - pC_ewc->AudioEncParams.Bitrate = M4VSS3GPP_AMR_DEFAULT_BITRATE; - pC_ewc->AudioEncParams.SpecifParam.AmrSID = M4ENCODER_kAmrNoSID; - break; - - case M4SYS_kAAC: - - err = M4VSS3GPP_setCurrentAudioEncoder(pC_ShellAPI, - pC_ewc->AudioStreamType); - M4ERR_CHECK_RETURN(err); - - pC_ewc->AudioEncParams.Format = M4ENCODER_kAAC; - - switch( pC_ewc->uiSamplingFrequency ) - { - case 8000: - pC_ewc->AudioEncParams.Frequency = M4ENCODER_k8000Hz; - break; - - case 16000: - pC_ewc->AudioEncParams.Frequency = M4ENCODER_k16000Hz; - break; - - case 22050: - pC_ewc->AudioEncParams.Frequency = M4ENCODER_k22050Hz; - break; - - case 24000: - pC_ewc->AudioEncParams.Frequency = M4ENCODER_k24000Hz; - break; - - case 32000: - pC_ewc->AudioEncParams.Frequency = M4ENCODER_k32000Hz; - break; - - case 44100: - pC_ewc->AudioEncParams.Frequency = M4ENCODER_k44100Hz; - break; - - case 48000: - pC_ewc->AudioEncParams.Frequency = M4ENCODER_k48000Hz; - break; - - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreateAudioEncoder: invalid input AAC sampling frequency\ - (%d Hz), returning M4VSS3GPP_ERR_AUDIO_DECODER_INIT_FAILED", - pC_ewc->uiSamplingFrequency); - return M4VSS3GPP_ERR_AUDIO_DECODER_INIT_FAILED; - } - pC_ewc->AudioEncParams.ChannelNum = (pC_ewc->uiNbChannels == 1) - ? M4ENCODER_kMono : M4ENCODER_kStereo; - pC_ewc->AudioEncParams.SpecifParam.AacParam.Regulation = - M4ENCODER_kAacRegulNone; //M4ENCODER_kAacBitReservoir - /* unused */ - pC_ewc->AudioEncParams.SpecifParam.AacParam.bIS = M4OSA_FALSE; - pC_ewc->AudioEncParams.SpecifParam.AacParam.bMS = M4OSA_FALSE; - pC_ewc->AudioEncParams.SpecifParam.AacParam.bPNS = M4OSA_FALSE; - pC_ewc->AudioEncParams.SpecifParam.AacParam.bTNS = M4OSA_FALSE; - /* TODO change into highspeed asap */ - pC_ewc->AudioEncParams.SpecifParam.AacParam.bHighSpeed = - M4OSA_FALSE; - - /* Quantify value (ceil one) */ - if( uiAudioBitrate <= 16000 ) - pC_ewc->AudioEncParams.Bitrate = 16000; - - else if( uiAudioBitrate <= 24000 ) - pC_ewc->AudioEncParams.Bitrate = 24000; - - else if( uiAudioBitrate <= 32000 ) - pC_ewc->AudioEncParams.Bitrate = 32000; - - else if( uiAudioBitrate <= 48000 ) - pC_ewc->AudioEncParams.Bitrate = 48000; - - else if( uiAudioBitrate <= 64000 ) - pC_ewc->AudioEncParams.Bitrate = 64000; - - else - pC_ewc->AudioEncParams.Bitrate = 96000; - - /* Special requirement of our encoder */ - if( ( pC_ewc->uiNbChannels == 2) - && (pC_ewc->AudioEncParams.Bitrate < 32000) ) - pC_ewc->AudioEncParams.Bitrate = 32000; - - break; - - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_intResetAudioEncoder: Undefined output audio format (%d),\ - returning M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT", - pC_ewc->AudioStreamType); - return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT; - } - - /* Initialise the audio encoder */ -#ifdef M4VSS_SUPPORT_OMX_CODECS - - M4OSA_TRACE3_1( - "M4VSS3GPP_intResetAudioEncoder:\ - pAudioEncoderGlobalFcts->pFctInit called with userdata 0x%x", - pC_ShellAPI->pCurrentAudioEncoderUserData); - err = pC_ShellAPI->pAudioEncoderGlobalFcts->pFctInit(&pC_ewc->pAudioEncCtxt, - pC_ShellAPI->pCurrentAudioEncoderUserData); - -#else - - err = pC_ShellAPI->pAudioEncoderGlobalFcts->pFctInit(&pC_ewc->pAudioEncCtxt, - M4OSA_NULL /* no HW encoder */); - -#endif - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intResetAudioEncoder: pAudioEncoderGlobalFcts->pFctInit returns 0x%x", - err); - return err; - } - - /* Open the audio encoder */ - err = pC_ShellAPI->pAudioEncoderGlobalFcts->pFctOpen(pC_ewc->pAudioEncCtxt, - &pC_ewc->AudioEncParams, &pC_ewc->pAudioEncDSI, - M4OSA_NULL /* no grabbing */); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intResetAudioEncoder: pAudioEncoderGlobalFcts->pFctOpen returns 0x%x", - err); - return err; - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intResetAudioEncoder: returning M4NO_ERROR"); - return M4NO_ERROR; -} diff --git a/libvideoeditor/vss/src/M4VSS3GPP_EditVideo.c b/libvideoeditor/vss/src/M4VSS3GPP_EditVideo.c deleted file mode 100755 index f19f412..0000000 --- a/libvideoeditor/vss/src/M4VSS3GPP_EditVideo.c +++ /dev/null @@ -1,3955 +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 M4VSS3GPP_EditVideo.c - * @brief Video Studio Service 3GPP edit API implementation. - * @note - ****************************************************************************** - */ -#undef M4OSA_TRACE_LEVEL -#define M4OSA_TRACE_LEVEL 1 - -/****************/ -/*** Includes ***/ -/****************/ - -#include "NXPSW_CompilerSwitches.h" -/** - * Our header */ -#include "M4VSS3GPP_API.h" -#include "M4VSS3GPP_InternalTypes.h" -#include "M4VSS3GPP_InternalFunctions.h" -#include "M4VSS3GPP_InternalConfig.h" -#include "M4VSS3GPP_ErrorCodes.h" - -// StageFright encoders require %16 resolution -#include "M4ENCODER_common.h" -/** - * OSAL headers */ -#include "M4OSA_Memory.h" /**< OSAL memory management */ -#include "M4OSA_Debug.h" /**< OSAL debug management */ - -/** - * component includes */ -#include "M4VFL_transition.h" /**< video effects */ - -/*for transition behaviour*/ -#include <math.h> -#include "M4AIR_API.h" -#include "M4VSS3GPP_Extended_API.h" -/** Determine absolute value of a. */ -#define M4xVSS_ABS(a) ( ( (a) < (0) ) ? (-(a)) : (a) ) -#define Y_PLANE_BORDER_VALUE 0x00 -#define U_PLANE_BORDER_VALUE 0x80 -#define V_PLANE_BORDER_VALUE 0x80 - -/************************************************************************/ -/* Static local functions */ -/************************************************************************/ - -static M4OSA_ERR M4VSS3GPP_intCheckVideoMode( - M4VSS3GPP_InternalEditContext *pC ); -static M4OSA_Void -M4VSS3GPP_intCheckVideoEffects( M4VSS3GPP_InternalEditContext *pC, - M4OSA_UInt8 uiClipNumber ); -static M4OSA_ERR M4VSS3GPP_intApplyVideoEffect( - M4VSS3GPP_InternalEditContext *pC, M4VIFI_ImagePlane *pPlaneIn, - M4VIFI_ImagePlane *pPlaneOut, M4OSA_Bool bSkipFramingEffect); - -static M4OSA_ERR -M4VSS3GPP_intVideoTransition( M4VSS3GPP_InternalEditContext *pC, - M4VIFI_ImagePlane *pPlaneOut ); - -static M4OSA_Void -M4VSS3GPP_intUpdateTimeInfo( M4VSS3GPP_InternalEditContext *pC, - M4SYS_AccessUnit *pAU ); -static M4OSA_Void M4VSS3GPP_intSetH263TimeCounter( M4OSA_MemAddr8 pAuDataBuffer, - M4OSA_UInt8 uiCts ); -static M4OSA_Void M4VSS3GPP_intSetMPEG4Gov( M4OSA_MemAddr8 pAuDataBuffer, - M4OSA_UInt32 uiCtsSec ); -static M4OSA_Void M4VSS3GPP_intGetMPEG4Gov( M4OSA_MemAddr8 pAuDataBuffer, - M4OSA_UInt32 *pCtsSec ); -static M4OSA_ERR M4VSS3GPP_intAllocateYUV420( M4VIFI_ImagePlane *pPlanes, - M4OSA_UInt32 uiWidth, M4OSA_UInt32 uiHeight ); -static M4OSA_ERR M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420( - M4OSA_Void* pFileIn, M4OSA_FileReadPointer* pFileReadPtr, - M4VIFI_ImagePlane* pImagePlanes, - M4OSA_UInt32 width,M4OSA_UInt32 height); -static M4OSA_ERR M4VSS3GPP_intApplyRenderingMode( - M4VSS3GPP_InternalEditContext *pC, - M4xVSS_MediaRendering renderingMode, - M4VIFI_ImagePlane* pInplane, - M4VIFI_ImagePlane* pOutplane); - -static M4OSA_ERR M4VSS3GPP_intSetYuv420PlaneFromARGB888 ( - M4VSS3GPP_InternalEditContext *pC, - M4VSS3GPP_ClipContext* pClipCtxt); -static M4OSA_ERR M4VSS3GPP_intRenderFrameWithEffect( - M4VSS3GPP_InternalEditContext *pC, - M4VSS3GPP_ClipContext* pClipCtxt, - M4_MediaTime ts, - M4OSA_Bool bIsClip1, - M4VIFI_ImagePlane *pResizePlane, - M4VIFI_ImagePlane *pPlaneNoResize, - M4VIFI_ImagePlane *pPlaneOut); - -static M4OSA_ERR M4VSS3GPP_intRotateVideo(M4VIFI_ImagePlane* pPlaneIn, - M4OSA_UInt32 rotationDegree); - -static M4OSA_ERR M4VSS3GPP_intSetYUV420Plane(M4VIFI_ImagePlane* planeIn, - M4OSA_UInt32 width, M4OSA_UInt32 height); - -static M4OSA_ERR M4VSS3GPP_intApplyVideoOverlay ( - M4VSS3GPP_InternalEditContext *pC, - M4VIFI_ImagePlane *pPlaneIn, - M4VIFI_ImagePlane *pPlaneOut); - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intEditStepVideo() - * @brief One step of video processing - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intEditStepVideo( M4VSS3GPP_InternalEditContext *pC ) -{ - M4OSA_ERR err; - M4OSA_Int32 iCts, iNextCts; - M4ENCODER_FrameMode FrameMode; - M4OSA_Bool bSkipFrame; - M4OSA_UInt16 offset; - - /** - * Check if we reached end cut. Decorrelate input and output encoding - * timestamp to handle encoder prefetch - */ - if ( ((M4OSA_Int32)(pC->ewc.dInputVidCts) - pC->pC1->iVoffset - + pC->iInOutTimeOffset) >= pC->pC1->iEndTime ) - { - /* Re-adjust video to precise cut time */ - pC->iInOutTimeOffset = ((M4OSA_Int32)(pC->ewc.dInputVidCts)) - - pC->pC1->iVoffset + pC->iInOutTimeOffset - pC->pC1->iEndTime; - if ( pC->iInOutTimeOffset < 0 ) { - pC->iInOutTimeOffset = 0; - } - - /** - * Video is done for this clip */ - err = M4VSS3GPP_intReachedEndOfVideo(pC); - - /* RC: to know when a file has been processed */ - if (M4NO_ERROR != err && err != M4VSS3GPP_WAR_SWITCH_CLIP) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: M4VSS3GPP_intReachedEndOfVideo returns 0x%x", - err); - } - - return err; - } - - /* Don't change the states if we are in decodeUpTo() */ - if ( (M4VSS3GPP_kClipStatus_DECODE_UP_TO != pC->pC1->Vstatus) - && (( pC->pC2 == M4OSA_NULL) - || (M4VSS3GPP_kClipStatus_DECODE_UP_TO != pC->pC2->Vstatus)) ) - { - /** - * Check Video Mode, depending on the current output CTS */ - err = M4VSS3GPP_intCheckVideoMode( - pC); /**< This function change the pC->Vstate variable! */ - - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: M4VSS3GPP_intCheckVideoMode returns 0x%x!", - err); - return err; - } - } - - - switch( pC->Vstate ) - { - /* _________________ */ - /*| |*/ - /*| READ_WRITE MODE |*/ - /*|_________________|*/ - - case M4VSS3GPP_kEditVideoState_READ_WRITE: - case M4VSS3GPP_kEditVideoState_AFTER_CUT: - { - M4OSA_TRACE3_0("M4VSS3GPP_intEditStepVideo READ_WRITE"); - - bSkipFrame = M4OSA_FALSE; - - /** - * If we were decoding the clip, we must jump to be sure - * to get to the good position. */ - if( M4VSS3GPP_kClipStatus_READ != pC->pC1->Vstatus ) - { - /** - * Jump to target video time (tc = to-T) */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - iCts = (M4OSA_Int32)(pC->ewc.dInputVidCts) - pC->pC1->iVoffset; - err = pC->pC1->ShellAPI.m_pReader->m_pFctJump( - pC->pC1->pReaderContext, - (M4_StreamHandler *)pC->pC1->pVideoStream, &iCts); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo:\ - READ_WRITE: m_pReader->m_pFctJump(V1) returns 0x%x!", - err); - return err; - } - - err = pC->pC1->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( - pC->pC1->pReaderContext, - (M4_StreamHandler *)pC->pC1->pVideoStream, - &pC->pC1->VideoAU); - - if( ( M4NO_ERROR != err) && (M4WAR_NO_MORE_AU != err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo:\ - READ_WRITE: m_pReader->m_pFctGetNextAu returns 0x%x!", - err); - return err; - } - - M4OSA_TRACE2_3("A .... read : cts = %.0f + %ld [ 0x%x ]", - pC->pC1->VideoAU.m_CTS, pC->pC1->iVoffset, - pC->pC1->VideoAU.m_size); - - /* This frame has been already written in BEGIN CUT step -> skip it */ - if( pC->pC1->VideoAU.m_CTS == iCts - && pC->pC1->iVideoRenderCts >= iCts ) - { - bSkipFrame = M4OSA_TRUE; - } - } - - /* This frame has been already written in BEGIN CUT step -> skip it */ - if( ( pC->Vstate == M4VSS3GPP_kEditVideoState_AFTER_CUT) - && (pC->pC1->VideoAU.m_CTS - + pC->pC1->iVoffset <= pC->ewc.WriterVideoAU.CTS) ) - { - bSkipFrame = M4OSA_TRUE; - } - - /** - * Remember the clip reading state */ - pC->pC1->Vstatus = M4VSS3GPP_kClipStatus_READ; - // Decorrelate input and output encoding timestamp to handle encoder prefetch - // Rounding is to compensate reader imprecision (m_CTS is actually an integer) - iCts = ((M4OSA_Int32)pC->ewc.dInputVidCts) - pC->pC1->iVoffset - 1; - iNextCts = iCts + ((M4OSA_Int32)pC->dOutputFrameDuration) + 1; - /* Avoid to write a last frame of duration 0 */ - if( iNextCts > pC->pC1->iEndTime ) - iNextCts = pC->pC1->iEndTime; - - /** - * If the AU is good to be written, write it, else just skip it */ - if( ( M4OSA_FALSE == bSkipFrame) - && (( pC->pC1->VideoAU.m_CTS >= iCts) - && (pC->pC1->VideoAU.m_CTS < iNextCts) - && (pC->pC1->VideoAU.m_size > 0)) ) - { - /** - * Get the output AU to write into */ - err = pC->ShellAPI.pWriterDataFcts->pStartAU( - pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_VIDEO_STREAM_ID, - &pC->ewc.WriterVideoAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: READ_WRITE:\ - pWriterDataFcts->pStartAU(Video) returns 0x%x!", - err); - return err; - } - - /** - * Copy the input AU to the output AU */ - pC->ewc.WriterVideoAU.attribute = pC->pC1->VideoAU.m_attribute; - // Decorrelate input and output encoding timestamp to handle encoder prefetch - pC->ewc.WriterVideoAU.CTS = (M4OSA_Time)pC->pC1->VideoAU.m_CTS + - (M4OSA_Time)pC->pC1->iVoffset; - pC->ewc.dInputVidCts += pC->dOutputFrameDuration; - offset = 0; - /* for h.264 stream do not read the 1st 4 bytes as they are header - indicators */ - if( pC->pC1->pVideoStream->m_basicProperties.m_streamType - == M4DA_StreamTypeVideoMpeg4Avc ) - offset = 4; - - pC->ewc.WriterVideoAU.size = pC->pC1->VideoAU.m_size - offset; - if( pC->ewc.WriterVideoAU.size > pC->ewc.uiVideoMaxAuSize ) - { - M4OSA_TRACE1_2( - "M4VSS3GPP_intEditStepVideo: READ_WRITE: AU size greater than\ - MaxAuSize (%d>%d)! returning M4VSS3GPP_ERR_INPUT_VIDEO_AU_TOO_LARGE", - pC->ewc.WriterVideoAU.size, pC->ewc.uiVideoMaxAuSize); - return M4VSS3GPP_ERR_INPUT_VIDEO_AU_TOO_LARGE; - } - - memcpy((void *)pC->ewc.WriterVideoAU.dataAddress, - (void *)(pC->pC1->VideoAU.m_dataAddress + offset), - (pC->ewc.WriterVideoAU.size)); - - /** - * Update time info for the Counter Time System to be equal to the bit - -stream time*/ - M4VSS3GPP_intUpdateTimeInfo(pC, &pC->ewc.WriterVideoAU); - M4OSA_TRACE2_2("B ---- write : cts = %lu [ 0x%x ]", - pC->ewc.WriterVideoAU.CTS, pC->ewc.WriterVideoAU.size); - - /** - * Write the AU */ - err = pC->ShellAPI.pWriterDataFcts->pProcessAU( - pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_VIDEO_STREAM_ID, - &pC->ewc.WriterVideoAU); - - if( M4NO_ERROR != err ) - { - /* the warning M4WAR_WRITER_STOP_REQ is returned when the targeted output - file size is reached - The editing is then finished, the warning M4VSS3GPP_WAR_EDITING_DONE - is returned*/ - if( M4WAR_WRITER_STOP_REQ == err ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intEditStepVideo: File was cut to avoid oversize"); - return M4VSS3GPP_WAR_EDITING_DONE; - } - else - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: READ_WRITE:\ - pWriterDataFcts->pProcessAU(Video) returns 0x%x!", - err); - return err; - } - } - - /** - * Read next AU for next step */ - err = pC->pC1->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( - pC->pC1->pReaderContext, - (M4_StreamHandler *)pC->pC1->pVideoStream, - &pC->pC1->VideoAU); - - if( ( M4NO_ERROR != err) && (M4WAR_NO_MORE_AU != err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: READ_WRITE:\ - m_pReaderDataIt->m_pFctGetNextAu returns 0x%x!", - err); - return err; - } - - M4OSA_TRACE2_3("C .... read : cts = %.0f + %ld [ 0x%x ]", - pC->pC1->VideoAU.m_CTS, pC->pC1->iVoffset, - pC->pC1->VideoAU.m_size); - } - else - { - /** - * Decide wether to read or to increment time increment */ - if( ( pC->pC1->VideoAU.m_size == 0) - || (pC->pC1->VideoAU.m_CTS >= iNextCts) ) - { - /*Increment time by the encoding period (NO_MORE_AU or reader in advance */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - pC->ewc.dInputVidCts += pC->dOutputFrameDuration; - - /* Switch (from AFTER_CUT) to normal mode because time is - no more frozen */ - pC->Vstate = M4VSS3GPP_kEditVideoState_READ_WRITE; - } - else - { - /* In other cases (reader late), just let the reader catch up - pC->ewc.dVTo */ - err = pC->pC1->ShellAPI.m_pReaderDataIt->m_pFctGetNextAu( - pC->pC1->pReaderContext, - (M4_StreamHandler *)pC->pC1->pVideoStream, - &pC->pC1->VideoAU); - - if( ( M4NO_ERROR != err) && (M4WAR_NO_MORE_AU != err) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: READ_WRITE:\ - m_pReaderDataIt->m_pFctGetNextAu returns 0x%x!", - err); - return err; - } - - M4OSA_TRACE2_3("D .... read : cts = %.0f + %ld [ 0x%x ]", - pC->pC1->VideoAU.m_CTS, pC->pC1->iVoffset, - pC->pC1->VideoAU.m_size); - } - } - } - break; - - /* ____________________ */ - /*| |*/ - /*| DECODE_ENCODE MODE |*/ - /*| BEGIN_CUT MODE |*/ - /*|____________________|*/ - - case M4VSS3GPP_kEditVideoState_DECODE_ENCODE: - case M4VSS3GPP_kEditVideoState_BEGIN_CUT: - { - M4OSA_TRACE3_0( - "M4VSS3GPP_intEditStepVideo DECODE_ENCODE / BEGIN_CUT"); - - if ((pC->pC1->pSettings->FileType == - M4VIDEOEDITING_kFileType_ARGB8888) && - (M4OSA_FALSE == - pC->pC1->pSettings->ClipProperties.bSetImageData)) { - - err = M4VSS3GPP_intSetYuv420PlaneFromARGB888(pC, pC->pC1); - if( M4NO_ERROR != err ) { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: DECODE_ENCODE:\ - M4VSS3GPP_intSetYuv420PlaneFromARGB888 err=%x", err); - return err; - } - } - /** - * Decode the video up to the target time - (will jump to the previous RAP if needed ) */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - err = M4VSS3GPP_intClipDecodeVideoUpToCts(pC->pC1, (M4OSA_Int32)pC->ewc.dInputVidCts); - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: DECODE_ENCODE:\ - M4VSS3GPP_intDecodeVideoUpToCts returns err=0x%x", - err); - return err; - } - - /* If the decoding is not completed, do one more step with time frozen */ - if( M4VSS3GPP_kClipStatus_DECODE_UP_TO == pC->pC1->Vstatus ) - { - return M4NO_ERROR; - } - - /** - * Reset the video pre-processing error before calling the encoder */ - pC->ewc.VppError = M4NO_ERROR; - - M4OSA_TRACE2_0("E ++++ encode AU"); - - /** - * Encode the frame(rendering,filtering and writing will be done - in encoder callbacks)*/ - if( pC->Vstate == M4VSS3GPP_kEditVideoState_BEGIN_CUT ) - FrameMode = M4ENCODER_kIFrame; - else - FrameMode = M4ENCODER_kNormalFrame; - - // Decorrelate input and output encoding timestamp to handle encoder prefetch - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctEncode(pC->ewc.pEncContext, M4OSA_NULL, - pC->ewc.dInputVidCts, FrameMode); - /** - * Check if we had a VPP error... */ - if( M4NO_ERROR != pC->ewc.VppError ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: DECODE_ENCODE:\ - pVideoEncoderGlobalFcts->pFctEncode, returning VppErr=0x%x", - pC->ewc.VppError); -#ifdef M4VSS_SUPPORT_OMX_CODECS - - if( M4WAR_VIDEORENDERER_NO_NEW_FRAME != pC->ewc.VppError ) - { -#endif //M4VSS_SUPPORT_OMX_CODECS - - return pC->ewc.VppError; -#ifdef M4VSS_SUPPORT_OMX_CODECS - - } - -#endif //M4VSS_SUPPORT_OMX_CODECS - } - else if( M4NO_ERROR != err ) /**< ...or an encoder error */ - { - if( ((M4OSA_UInt32)M4ERR_ALLOC) == err ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intEditStepVideo: DECODE_ENCODE:\ - returning M4VSS3GPP_ERR_ENCODER_ACCES_UNIT_ERROR"); - return M4VSS3GPP_ERR_ENCODER_ACCES_UNIT_ERROR; - } - /* the warning M4WAR_WRITER_STOP_REQ is returned when the targeted output - file size is reached - The editing is then finished, the warning M4VSS3GPP_WAR_EDITING_DONE - is returned*/ - else if( M4WAR_WRITER_STOP_REQ == err ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intEditStepVideo: File was cut to avoid oversize"); - return M4VSS3GPP_WAR_EDITING_DONE; - } - else - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: DECODE_ENCODE:\ - pVideoEncoderGlobalFcts->pFctEncode returns 0x%x", - err); - return err; - } - } - - /** - * Increment time by the encoding period (for begin cut, do not increment to not - loose P-frames) */ - if( M4VSS3GPP_kEditVideoState_DECODE_ENCODE == pC->Vstate ) - { - // Decorrelate input and output encoding timestamp to handle encoder prefetch - pC->ewc.dInputVidCts += pC->dOutputFrameDuration; - } - } - break; - - /* _________________ */ - /*| |*/ - /*| TRANSITION MODE |*/ - /*|_________________|*/ - - case M4VSS3GPP_kEditVideoState_TRANSITION: - { - M4OSA_TRACE3_0("M4VSS3GPP_intEditStepVideo TRANSITION"); - - /* Don't decode more than needed */ - if( !(( M4VSS3GPP_kClipStatus_DECODE_UP_TO != pC->pC1->Vstatus) - && (M4VSS3GPP_kClipStatus_DECODE_UP_TO == pC->pC2->Vstatus)) ) - { - /** - * Decode the clip1 video up to the target time - (will jump to the previous RAP if needed */ - if ((pC->pC1->pSettings->FileType == - M4VIDEOEDITING_kFileType_ARGB8888) && - (M4OSA_FALSE == - pC->pC1->pSettings->ClipProperties.bSetImageData)) { - - err = M4VSS3GPP_intSetYuv420PlaneFromARGB888(pC, pC->pC1); - if( M4NO_ERROR != err ) { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: TRANSITION:\ - M4VSS3GPP_intSetYuv420PlaneFromARGB888 err=%x", err); - return err; - } - } - // Decorrelate input and output encoding timestamp to handle encoder prefetch - err = M4VSS3GPP_intClipDecodeVideoUpToCts(pC->pC1, - (M4OSA_Int32)pC->ewc.dInputVidCts); - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: TRANSITION:\ - M4VSS3GPP_intDecodeVideoUpToCts(C1) returns err=0x%x", - err); - return err; - } - - /* If the decoding is not completed, do one more step with time frozen */ - if( M4VSS3GPP_kClipStatus_DECODE_UP_TO == pC->pC1->Vstatus ) - { - return M4NO_ERROR; - } - } - - /* Don't decode more than needed */ - if( !(( M4VSS3GPP_kClipStatus_DECODE_UP_TO != pC->pC2->Vstatus) - && (M4VSS3GPP_kClipStatus_DECODE_UP_TO == pC->pC1->Vstatus)) ) - { - /** - * Decode the clip2 video up to the target time - (will jump to the previous RAP if needed) */ - if ((pC->pC2->pSettings->FileType == - M4VIDEOEDITING_kFileType_ARGB8888) && - (M4OSA_FALSE == - pC->pC2->pSettings->ClipProperties.bSetImageData)) { - - err = M4VSS3GPP_intSetYuv420PlaneFromARGB888(pC, pC->pC2); - if( M4NO_ERROR != err ) { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: TRANSITION:\ - M4VSS3GPP_intSetYuv420PlaneFromARGB888 err=%x", err); - return err; - } - } - - // Decorrelate input and output encoding timestamp to handle encoder prefetch - err = M4VSS3GPP_intClipDecodeVideoUpToCts(pC->pC2, - (M4OSA_Int32)pC->ewc.dInputVidCts); - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: TRANSITION:\ - M4VSS3GPP_intDecodeVideoUpToCts(C2) returns err=0x%x", - err); - return err; - } - - /* If the decoding is not completed, do one more step with time frozen */ - if( M4VSS3GPP_kClipStatus_DECODE_UP_TO == pC->pC2->Vstatus ) - { - return M4NO_ERROR; - } - } - - /** - * Reset the video pre-processing error before calling the encoder */ - pC->ewc.VppError = M4NO_ERROR; - - M4OSA_TRACE2_0("F **** blend AUs"); - - /** - * Encode the frame (rendering, filtering and writing will be done - in encoder callbacks */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctEncode(pC->ewc.pEncContext, M4OSA_NULL, - pC->ewc.dInputVidCts, M4ENCODER_kNormalFrame); - - /** - * If encode returns a process frame error, it is likely to be a VPP error */ - if( M4NO_ERROR != pC->ewc.VppError ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: TRANSITION:\ - pVideoEncoderGlobalFcts->pFctEncode, returning VppErr=0x%x", - pC->ewc.VppError); -#ifdef M4VSS_SUPPORT_OMX_CODECS - - if( M4WAR_VIDEORENDERER_NO_NEW_FRAME != pC->ewc.VppError ) - { - -#endif //M4VSS_SUPPORT_OMX_CODECS - - return pC->ewc.VppError; -#ifdef M4VSS_SUPPORT_OMX_CODECS - - } - -#endif //M4VSS_SUPPORT_OMX_CODECS - } - else if( M4NO_ERROR != err ) /**< ...or an encoder error */ - { - if( ((M4OSA_UInt32)M4ERR_ALLOC) == err ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intEditStepVideo: TRANSITION:\ - returning M4VSS3GPP_ERR_ENCODER_ACCES_UNIT_ERROR"); - return M4VSS3GPP_ERR_ENCODER_ACCES_UNIT_ERROR; - } - - /* the warning M4WAR_WRITER_STOP_REQ is returned when the targeted output - file size is reached - The editing is then finished, the warning M4VSS3GPP_WAR_EDITING_DONE is - returned*/ - else if( M4WAR_WRITER_STOP_REQ == err ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intEditStepVideo: File was cut to avoid oversize"); - return M4VSS3GPP_WAR_EDITING_DONE; - } - else - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: TRANSITION:\ - pVideoEncoderGlobalFcts->pFctEncode returns 0x%x", - err); - return err; - } - } - - /** - * Increment time by the encoding period */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - pC->ewc.dInputVidCts += pC->dOutputFrameDuration; - } - break; - - /* ____________ */ - /*| |*/ - /*| ERROR CASE |*/ - /*|____________|*/ - - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_intEditStepVideo: invalid internal state (0x%x),\ - returning M4VSS3GPP_ERR_INTERNAL_STATE", - pC->Vstate); - return M4VSS3GPP_ERR_INTERNAL_STATE; - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intEditStepVideo: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intCheckVideoMode() - * @brief Check which video process mode we must use, depending on the output CTS. - * @param pC (IN/OUT) Internal edit context - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intCheckVideoMode( - M4VSS3GPP_InternalEditContext *pC ) -{ - M4OSA_ERR err; - // Decorrelate input and output encoding timestamp to handle encoder prefetch - const M4OSA_Int32 t = (M4OSA_Int32)pC->ewc.dInputVidCts; - /**< Transition duration */ - const M4OSA_Int32 TD = pC->pTransitionList[pC->uiCurrentClip].uiTransitionDuration; - - M4OSA_Int32 iTmp; - - const M4VSS3GPP_EditVideoState previousVstate = pC->Vstate; - - /** - * Check if Clip1 is on its begin cut, or in an effect zone */ - M4VSS3GPP_intCheckVideoEffects(pC, 1); - - /** - * Check if we are in the transition with next clip */ - if( ( TD > 0) && (( t - pC->pC1->iVoffset) >= (pC->pC1->iEndTime - TD)) ) - { - /** - * We are in a transition */ - pC->Vstate = M4VSS3GPP_kEditVideoState_TRANSITION; - pC->bTransitionEffect = M4OSA_TRUE; - - /** - * Open second clip for transition, if not yet opened */ - if( M4OSA_NULL == pC->pC2 ) - { - pC->pC1->bGetYuvDataFromDecoder = M4OSA_TRUE; - - err = M4VSS3GPP_intOpenClip(pC, &pC->pC2, - &pC->pClipList[pC->uiCurrentClip + 1]); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCheckVideoMode: M4VSS3GPP_editOpenClip returns 0x%x!", - err); - return err; - } - - /** - * Add current video output CTS to the clip offset - * (audio output CTS is not yet at the transition, so audio - * offset can't be updated yet). */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - pC->pC2->iVoffset += (M4OSA_UInt32)pC->ewc.dInputVidCts; - - /** - * 2005-03-24: BugFix for audio-video synchro: - * Update transition duration due to the actual video transition beginning time. - * It will avoid desynchronization when doing the audio transition. */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - iTmp = ((M4OSA_Int32)pC->ewc.dInputVidCts)\ - - (pC->pC1->iEndTime - TD + pC->pC1->iVoffset); - if (iTmp < (M4OSA_Int32)pC->pTransitionList[pC->uiCurrentClip].uiTransitionDuration) - /**< Test in case of a very short transition */ - { - pC->pTransitionList[pC-> - uiCurrentClip].uiTransitionDuration -= iTmp; - - /** - * Don't forget to also correct the total duration used for the progress bar - * (it was computed with the original transition duration). */ - pC->ewc.iOutputDuration += iTmp; - } - /**< No "else" here because it's hard predict the effect of 0 duration transition...*/ - } - - /** - * Check effects for clip2 */ - M4VSS3GPP_intCheckVideoEffects(pC, 2); - } - else - { - /** - * We are not in a transition */ - pC->bTransitionEffect = M4OSA_FALSE; - - /* If there is an effect we go to decode/encode mode */ - if((pC->nbActiveEffects > 0) || (pC->nbActiveEffects1 > 0) || - (pC->pC1->pSettings->FileType == - M4VIDEOEDITING_kFileType_ARGB8888) || - (pC->pC1->pSettings->bTranscodingRequired == M4OSA_TRUE)) { - pC->Vstate = M4VSS3GPP_kEditVideoState_DECODE_ENCODE; - } - /* We do a begin cut, except if already done (time is not progressing because we want - to catch all P-frames after the cut) */ - else if( M4OSA_TRUE == pC->bClip1AtBeginCut ) - { - if(pC->pC1->pSettings->ClipProperties.VideoStreamType == M4VIDEOEDITING_kH264) { - pC->Vstate = M4VSS3GPP_kEditVideoState_DECODE_ENCODE; - pC->bEncodeTillEoF = M4OSA_TRUE; - } else if( ( M4VSS3GPP_kEditVideoState_BEGIN_CUT == previousVstate) - || (M4VSS3GPP_kEditVideoState_AFTER_CUT == previousVstate) ) { - pC->Vstate = M4VSS3GPP_kEditVideoState_AFTER_CUT; - } else { - pC->Vstate = M4VSS3GPP_kEditVideoState_BEGIN_CUT; - } - } - /* Else we are in default copy/paste mode */ - else - { - if( ( M4VSS3GPP_kEditVideoState_BEGIN_CUT == previousVstate) - || (M4VSS3GPP_kEditVideoState_AFTER_CUT == previousVstate) ) - { - pC->Vstate = M4VSS3GPP_kEditVideoState_AFTER_CUT; - } - else if( pC->bIsMMS == M4OSA_TRUE ) - { - M4OSA_UInt32 currentBitrate; - M4OSA_ERR err = M4NO_ERROR; - - /* Do we need to reencode the video to downgrade the bitrate or not ? */ - /* Let's compute the cirrent bitrate of the current edited clip */ - err = pC->pC1->ShellAPI.m_pReader->m_pFctGetOption( - pC->pC1->pReaderContext, - M4READER_kOptionID_Bitrate, ¤tBitrate); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCheckVideoMode:\ - Error when getting next bitrate of edited clip: 0x%x", - err); - return err; - } - - /* Remove audio bitrate */ - currentBitrate -= 12200; - - /* Test if we go into copy/paste mode or into decode/encode mode */ - if( currentBitrate > pC->uiMMSVideoBitrate ) - { - pC->Vstate = M4VSS3GPP_kEditVideoState_DECODE_ENCODE; - } - else - { - pC->Vstate = M4VSS3GPP_kEditVideoState_READ_WRITE; - } - } - else if(!((pC->m_bClipExternalHasStarted == M4OSA_TRUE) && - (pC->Vstate == M4VSS3GPP_kEditVideoState_DECODE_ENCODE)) && - pC->bEncodeTillEoF == M4OSA_FALSE) - { - /** - * Test if we go into copy/paste mode or into decode/encode mode - * If an external effect has been applied on the current clip - * then continue to be in decode/encode mode till end of - * clip to avoid H.264 distortion. - */ - pC->Vstate = M4VSS3GPP_kEditVideoState_READ_WRITE; - } - } - } - - /** - * Check if we create an encoder */ - if( ( ( M4VSS3GPP_kEditVideoState_READ_WRITE == previousVstate) - || (M4VSS3GPP_kEditVideoState_AFTER_CUT - == previousVstate)) /**< read mode */ - && (( M4VSS3GPP_kEditVideoState_DECODE_ENCODE == pC->Vstate) - || (M4VSS3GPP_kEditVideoState_BEGIN_CUT == pC->Vstate) - || (M4VSS3GPP_kEditVideoState_TRANSITION - == pC->Vstate)) /**< encode mode */ - && pC->bIsMMS == M4OSA_FALSE ) - { - /** - * Create the encoder, if not created already*/ - if (pC->ewc.encoderState == M4VSS3GPP_kNoEncoder) { - err = M4VSS3GPP_intCreateVideoEncoder(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCheckVideoMode: M4VSS3GPP_intCreateVideoEncoder \ - returns 0x%x!", err); - return err; - } - } - } - else if( pC->bIsMMS == M4OSA_TRUE && pC->ewc.pEncContext == M4OSA_NULL ) - { - /** - * Create the encoder */ - err = M4VSS3GPP_intCreateVideoEncoder(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCheckVideoMode: M4VSS3GPP_intCreateVideoEncoder returns 0x%x!", - err); - return err; - } - } - - /** - * When we go from filtering to read/write, we must act like a begin cut, - * because the last filtered image may be different than the original image. */ - else if( ( ( M4VSS3GPP_kEditVideoState_DECODE_ENCODE == previousVstate) - || (M4VSS3GPP_kEditVideoState_TRANSITION - == previousVstate)) /**< encode mode */ - && (M4VSS3GPP_kEditVideoState_READ_WRITE == pC->Vstate) /**< read mode */ - && (pC->bEncodeTillEoF == M4OSA_FALSE) ) - { - pC->Vstate = M4VSS3GPP_kEditVideoState_BEGIN_CUT; - } - - /** - * Check if we destroy an encoder */ - else if( ( ( M4VSS3GPP_kEditVideoState_DECODE_ENCODE == previousVstate) - || (M4VSS3GPP_kEditVideoState_BEGIN_CUT == previousVstate) - || (M4VSS3GPP_kEditVideoState_TRANSITION - == previousVstate)) /**< encode mode */ - && (( M4VSS3GPP_kEditVideoState_READ_WRITE == pC->Vstate) - || (M4VSS3GPP_kEditVideoState_AFTER_CUT - == pC->Vstate)) /**< read mode */ - && pC->bIsMMS == M4OSA_FALSE ) - { - /** - * Destroy the previously created encoder */ - err = M4VSS3GPP_intDestroyVideoEncoder(pC); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCheckVideoMode: M4VSS3GPP_intDestroyVideoEncoder returns 0x%x!", - err); - return err; - } - } - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4VSS3GPP_intCheckVideoMode: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intStartAU() - * @brief StartAU writer-like interface used for the VSS 3GPP only - * @note - * @param pContext: (IN) It is the VSS 3GPP context in our case - * @param streamID: (IN) Id of the stream to which the Access Unit is related. - * @param pAU: (IN/OUT) Access Unit to be prepared. - * @return M4NO_ERROR: there is no error - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intStartAU( M4WRITER_Context pContext, - M4SYS_StreamID streamID, M4SYS_AccessUnit *pAU ) -{ - M4OSA_ERR err; - M4OSA_UInt32 uiMaxAuSize; - - /** - * Given context is actually the VSS3GPP context */ - M4VSS3GPP_InternalEditContext *pC = - (M4VSS3GPP_InternalEditContext *)pContext; - - /** - * Get the output AU to write into */ - err = pC->ShellAPI.pWriterDataFcts->pStartAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_VIDEO_STREAM_ID, pAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intStartAU: pWriterDataFcts->pStartAU(Video) returns 0x%x!", - err); - return err; - } - - /** - * Return */ - M4OSA_TRACE3_0("M4VSS3GPP_intStartAU: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intProcessAU() - * @brief ProcessAU writer-like interface used for the VSS 3GPP only - * @note - * @param pContext: (IN) It is the VSS 3GPP context in our case - * @param streamID: (IN) Id of the stream to which the Access Unit is related. - * @param pAU: (IN/OUT) Access Unit to be written - * @return M4NO_ERROR: there is no error - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intProcessAU( M4WRITER_Context pContext, - M4SYS_StreamID streamID, M4SYS_AccessUnit *pAU ) -{ - M4OSA_ERR err; - - /** - * Given context is actually the VSS3GPP context */ - M4VSS3GPP_InternalEditContext *pC = - (M4VSS3GPP_InternalEditContext *)pContext; - - /** - * Fix the encoded AU time */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - pC->ewc.dOutputVidCts = pAU->CTS; - /** - * Update time info for the Counter Time System to be equal to the bit-stream time */ - M4VSS3GPP_intUpdateTimeInfo(pC, pAU); - - /** - * Write the AU */ - err = pC->ShellAPI.pWriterDataFcts->pProcessAU(pC->ewc.p3gpWriterContext, - M4VSS3GPP_WRITER_VIDEO_STREAM_ID, pAU); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intProcessAU: pWriterDataFcts->pProcessAU(Video) returns 0x%x!", - err); - return err; - } - - /** - * Return */ - M4OSA_TRACE3_0("M4VSS3GPP_intProcessAU: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intVPP() - * @brief We implement our own VideoPreProcessing function - * @note It is called by the video encoder - * @param pContext (IN) VPP context, which actually is the VSS 3GPP context in our case - * @param pPlaneIn (IN) - * @param pPlaneOut (IN/OUT) Pointer to an array of 3 planes that will contain the output - * YUV420 image - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intVPP( M4VPP_Context pContext, M4VIFI_ImagePlane *pPlaneIn, - M4VIFI_ImagePlane *pPlaneOut ) -{ - M4OSA_ERR err = M4NO_ERROR; - M4_MediaTime ts; - M4VIFI_ImagePlane *pTmp = M4OSA_NULL; - M4VIFI_ImagePlane *pLastDecodedFrame = M4OSA_NULL ; - M4VIFI_ImagePlane *pDecoderRenderFrame = M4OSA_NULL; - M4VIFI_ImagePlane pTemp1[3],pTemp2[3]; - M4VIFI_ImagePlane pTempPlaneClip1[3],pTempPlaneClip2[3]; - M4OSA_UInt32 i = 0, yuvFrameWidth = 0, yuvFrameHeight = 0; - M4OSA_Bool bSkipFrameEffect = M4OSA_FALSE; - /** - * VPP context is actually the VSS3GPP context */ - M4VSS3GPP_InternalEditContext *pC = - (M4VSS3GPP_InternalEditContext *)pContext; - - memset((void *)pTemp1, 0, 3*sizeof(M4VIFI_ImagePlane)); - memset((void *)pTemp2, 0, 3*sizeof(M4VIFI_ImagePlane)); - memset((void *)pTempPlaneClip1, 0, 3*sizeof(M4VIFI_ImagePlane)); - memset((void *)pTempPlaneClip2, 0, 3*sizeof(M4VIFI_ImagePlane)); - - /** - * Reset VPP error remembered in context */ - pC->ewc.VppError = M4NO_ERROR; - - /** - * At the end of the editing, we may be called when no more clip is loaded. - * (because to close the encoder properly it must be stepped one or twice...) */ - if( M4OSA_NULL == pC->pC1 ) - { - /** - * We must fill the input of the encoder with a dummy image, because - * encoding noise leads to a huge video AU, and thus a writer buffer overflow. */ - memset((void *)pPlaneOut[0].pac_data,0, - pPlaneOut[0].u_stride * pPlaneOut[0].u_height); - memset((void *)pPlaneOut[1].pac_data,0, - pPlaneOut[1].u_stride * pPlaneOut[1].u_height); - memset((void *)pPlaneOut[2].pac_data,0, - pPlaneOut[2].u_stride * pPlaneOut[2].u_height); - - M4OSA_TRACE3_0("M4VSS3GPP_intVPP: returning M4NO_ERROR (abort)"); - return M4NO_ERROR; - } - - /** - **************** Transition case ****************/ - if( M4OSA_TRUE == pC->bTransitionEffect ) - { - - err = M4VSS3GPP_intAllocateYUV420(pTemp1, pC->ewc.uiVideoWidth, - pC->ewc.uiVideoHeight); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420(1) returns 0x%x, \ - returning M4NO_ERROR", err); - pC->ewc.VppError = err; - return M4NO_ERROR; /**< Return no error to the encoder core - (else it may leak in some situations...) */ - } - - err = M4VSS3GPP_intAllocateYUV420(pTemp2, pC->ewc.uiVideoWidth, - pC->ewc.uiVideoHeight); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420(2) returns 0x%x, \ - returning M4NO_ERROR", err); - pC->ewc.VppError = err; - return M4NO_ERROR; /**< Return no error to the encoder core - (else it may leak in some situations...) */ - } - - err = M4VSS3GPP_intAllocateYUV420(pC->yuv1, pC->ewc.uiVideoWidth, - pC->ewc.uiVideoHeight); - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420(3) returns 0x%x,\ - returning M4NO_ERROR", - err); - pC->ewc.VppError = err; - return - M4NO_ERROR; /**< Return no error to the encoder core - (else it may leak in some situations...) */ - } - - err = M4VSS3GPP_intAllocateYUV420(pC->yuv2, pC->ewc.uiVideoWidth, - pC->ewc.uiVideoHeight); - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420(4) returns 0x%x,\ - returning M4NO_ERROR", - err); - pC->ewc.VppError = err; - return - M4NO_ERROR; /**< Return no error to the encoder core - (else it may leak in some situations...) */ - } - - err = M4VSS3GPP_intAllocateYUV420(pC->yuv3, pC->ewc.uiVideoWidth, - pC->ewc.uiVideoHeight); - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420(3) returns 0x%x,\ - returning M4NO_ERROR", - err); - pC->ewc.VppError = err; - return - M4NO_ERROR; /**< Return no error to the encoder core - (else it may leak in some situations...) */ - } - - /** - * Compute the time in the clip1 base: ts = to - Offset */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - ts = pC->ewc.dInputVidCts - pC->pC1->iVoffset; - - /** - * Render Clip1 */ - if( pC->pC1->isRenderDup == M4OSA_FALSE ) - { - err = M4VSS3GPP_intRenderFrameWithEffect(pC, pC->pC1, ts, M4OSA_TRUE, - pTempPlaneClip1, pTemp1, - pPlaneOut); - if ((M4NO_ERROR != err) && - (M4WAR_VIDEORENDERER_NO_NEW_FRAME != err)) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ - M4VSS3GPP_intRenderFrameWithEffect returns 0x%x", err); - pC->ewc.VppError = err; - /** Return no error to the encoder core - * else it may leak in some situations.*/ - return M4NO_ERROR; - } - } - if ((pC->pC1->isRenderDup == M4OSA_TRUE) || - (M4WAR_VIDEORENDERER_NO_NEW_FRAME == err)) { - pTmp = pC->yuv1; - if (pC->pC1->lastDecodedPlane != M4OSA_NULL) { - /* Copy last decoded plane to output plane */ - memcpy((void *)pTmp[0].pac_data, - (void *)pC->pC1->lastDecodedPlane[0].pac_data, - (pTmp[0].u_height * pTmp[0].u_width)); - memcpy((void *)pTmp[1].pac_data, - (void *)pC->pC1->lastDecodedPlane[1].pac_data, - (pTmp[1].u_height * pTmp[1].u_width)); - memcpy((void *)pTmp[2].pac_data, - (void *)pC->pC1->lastDecodedPlane[2].pac_data, - (pTmp[2].u_height * pTmp[2].u_width)); - } else { - err = M4VSS3GPP_ERR_NO_VALID_VID_FRAME; - M4OSA_TRACE1_3("Can not find an input frame. Set error 0x%x in %s (%d)", - err, __FILE__, __LINE__); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - pC->pC1->lastDecodedPlane = pTmp; - } - - /** - * Compute the time in the clip2 base: ts = to - Offset */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - ts = pC->ewc.dInputVidCts - pC->pC2->iVoffset; - /** - * Render Clip2 */ - if( pC->pC2->isRenderDup == M4OSA_FALSE ) - { - - err = M4VSS3GPP_intRenderFrameWithEffect(pC, pC->pC2, ts, M4OSA_FALSE, - pTempPlaneClip2, pTemp2, - pPlaneOut); - if ((M4NO_ERROR != err) && - (M4WAR_VIDEORENDERER_NO_NEW_FRAME != err)) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ - M4VSS3GPP_intRenderFrameWithEffect returns 0x%x", err); - pC->ewc.VppError = err; - /** Return no error to the encoder core - * else it may leak in some situations.*/ - return M4NO_ERROR; - } - } - if ((pC->pC2->isRenderDup == M4OSA_TRUE) || - (M4WAR_VIDEORENDERER_NO_NEW_FRAME == err)) { - pTmp = pC->yuv2; - if (pC->pC2->lastDecodedPlane != M4OSA_NULL) { - /* Copy last decoded plane to output plane */ - memcpy((void *)pTmp[0].pac_data, - (void *)pC->pC2->lastDecodedPlane[0].pac_data, - (pTmp[0].u_height * pTmp[0].u_width)); - memcpy((void *)pTmp[1].pac_data, - (void *)pC->pC2->lastDecodedPlane[1].pac_data, - (pTmp[1].u_height * pTmp[1].u_width)); - memcpy((void *)pTmp[2].pac_data, - (void *)pC->pC2->lastDecodedPlane[2].pac_data, - (pTmp[2].u_height * pTmp[2].u_width)); - } else { - err = M4VSS3GPP_ERR_NO_VALID_VID_FRAME; - M4OSA_TRACE1_3("Can not find an input frame. Set error 0x%x in %s (%d)", - err, __FILE__, __LINE__); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - pC->pC2->lastDecodedPlane = pTmp; - } - - - pTmp = pPlaneOut; - err = M4VSS3GPP_intVideoTransition(pC, pTmp); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intVPP: M4VSS3GPP_intVideoTransition returns 0x%x,\ - returning M4NO_ERROR", - err); - pC->ewc.VppError = err; - return M4NO_ERROR; /**< Return no error to the encoder core - (else it may leak in some situations...) */ - } - for (i=0; i < 3; i++) - { - if(pTempPlaneClip2[i].pac_data != M4OSA_NULL) { - free(pTempPlaneClip2[i].pac_data); - pTempPlaneClip2[i].pac_data = M4OSA_NULL; - } - - if(pTempPlaneClip1[i].pac_data != M4OSA_NULL) { - free(pTempPlaneClip1[i].pac_data); - pTempPlaneClip1[i].pac_data = M4OSA_NULL; - } - - if (pTemp2[i].pac_data != M4OSA_NULL) { - free(pTemp2[i].pac_data); - pTemp2[i].pac_data = M4OSA_NULL; - } - - if (pTemp1[i].pac_data != M4OSA_NULL) { - free(pTemp1[i].pac_data); - pTemp1[i].pac_data = M4OSA_NULL; - } - } - } - /** - **************** No Transition case ****************/ - else - { - M4OSA_TRACE3_0("M4VSS3GPP_intVPP: NO transition case"); - /** - * Compute the time in the clip base: ts = to - Offset */ - ts = pC->ewc.dInputVidCts - pC->pC1->iVoffset; - pC->bIssecondClip = M4OSA_FALSE; - /** - * Render */ - if (pC->pC1->isRenderDup == M4OSA_FALSE) { - M4OSA_TRACE3_0("M4VSS3GPP_intVPP: renderdup false"); - /** - * Check if resizing is needed */ - if (M4OSA_NULL != pC->pC1->m_pPreResizeFrame) { - if ((pC->pC1->pSettings->FileType == - M4VIDEOEDITING_kFileType_ARGB8888) && - (pC->nbActiveEffects == 0) && - (pC->pC1->bGetYuvDataFromDecoder == M4OSA_FALSE)) { - err = pC->pC1->ShellAPI.m_pVideoDecoder->m_pFctSetOption( - pC->pC1->pViDecCtxt, - M4DECODER_kOptionID_EnableYuvWithEffect, - (M4OSA_DataOption)M4OSA_TRUE); - if (M4NO_ERROR == err ) { - err = pC->pC1->ShellAPI.m_pVideoDecoder->m_pFctRender( - pC->pC1->pViDecCtxt, &ts, - pPlaneOut, M4OSA_TRUE); - } - } else { - if (pC->pC1->pSettings->FileType == - M4VIDEOEDITING_kFileType_ARGB8888) { - err = pC->pC1->ShellAPI.m_pVideoDecoder->m_pFctSetOption( - pC->pC1->pViDecCtxt, - M4DECODER_kOptionID_EnableYuvWithEffect, - (M4OSA_DataOption)M4OSA_FALSE); - } - if (M4NO_ERROR == err) { - err = pC->pC1->ShellAPI.m_pVideoDecoder->m_pFctRender( - pC->pC1->pViDecCtxt, &ts, - pC->pC1->m_pPreResizeFrame, M4OSA_TRUE); - } - } - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ - m_pFctRender() returns error 0x%x", err); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - if (pC->pC1->pSettings->FileType != - M4VIDEOEDITING_kFileType_ARGB8888) { - if (0 != pC->pC1->pSettings->ClipProperties.videoRotationDegrees) { - // Save width and height of un-rotated frame - yuvFrameWidth = pC->pC1->m_pPreResizeFrame[0].u_width; - yuvFrameHeight = pC->pC1->m_pPreResizeFrame[0].u_height; - err = M4VSS3GPP_intRotateVideo(pC->pC1->m_pPreResizeFrame, - pC->pC1->pSettings->ClipProperties.videoRotationDegrees); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ - rotateVideo() returns error 0x%x", err); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - } - } - - if (pC->nbActiveEffects > 0) { - pC->pC1->bGetYuvDataFromDecoder = M4OSA_TRUE; - /** - * If we do modify the image, we need an intermediate - * image plane */ - err = M4VSS3GPP_intAllocateYUV420(pTemp1, - pC->pC1->m_pPreResizeFrame[0].u_width, - pC->pC1->m_pPreResizeFrame[0].u_height); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ - M4VSS3GPP_intAllocateYUV420 error 0x%x", err); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - /* If video frame need to be resized, then apply the overlay after - * the frame was rendered with rendering mode. - * Here skip the framing(overlay) effect when applying video Effect. */ - bSkipFrameEffect = M4OSA_TRUE; - err = M4VSS3GPP_intApplyVideoEffect(pC, - pC->pC1->m_pPreResizeFrame, pTemp1, bSkipFrameEffect); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ - M4VSS3GPP_intApplyVideoEffect() error 0x%x", err); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - pDecoderRenderFrame= pTemp1; - - } else { - pDecoderRenderFrame = pC->pC1->m_pPreResizeFrame; - } - /* Prepare overlay temporary buffer if overlay exist */ - if (pC->bClip1ActiveFramingEffect) { - err = M4VSS3GPP_intAllocateYUV420(pTemp2, - pPlaneOut[0].u_width, pPlaneOut[0].u_height); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420 \ - returns 0x%x, returning M4NO_ERROR", err); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - pTmp = pTemp2; - } else { - pTmp = pPlaneOut; - } - - /* Do rendering mode. */ - if ((pC->pC1->bGetYuvDataFromDecoder == M4OSA_TRUE) || - (pC->pC1->pSettings->FileType != - M4VIDEOEDITING_kFileType_ARGB8888)) { - - err = M4VSS3GPP_intApplyRenderingMode(pC, - pC->pC1->pSettings->xVSS.MediaRendering, - pDecoderRenderFrame, pTmp); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ - M4VSS3GPP_intApplyRenderingMode) error 0x%x ", err); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - } - - /* Apply overlay if overlay is exist */ - if (pC->bClip1ActiveFramingEffect) { - pDecoderRenderFrame = pTmp; - pTmp = pPlaneOut; - err = M4VSS3GPP_intApplyVideoOverlay(pC, - pDecoderRenderFrame, pTmp); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ - M4VSS3GPP_intApplyVideoOverlay) error 0x%x ", err); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - } - - if ((pC->pC1->pSettings->FileType == - M4VIDEOEDITING_kFileType_ARGB8888) && - (pC->nbActiveEffects == 0) && - (pC->pC1->bGetYuvDataFromDecoder == M4OSA_TRUE)) { - - err = pC->pC1->ShellAPI.m_pVideoDecoder->m_pFctSetOption( - pC->pC1->pViDecCtxt, - M4DECODER_kOptionID_YuvWithEffectNonContiguous, - (M4OSA_DataOption)pTmp); - if (M4NO_ERROR != err) { - pC->ewc.VppError = err; - return M4NO_ERROR; - } - pC->pC1->bGetYuvDataFromDecoder = M4OSA_FALSE; - } - - // Reset original width and height for resize frame plane - if (0 != pC->pC1->pSettings->ClipProperties.videoRotationDegrees && - 180 != pC->pC1->pSettings->ClipProperties.videoRotationDegrees) { - - M4VSS3GPP_intSetYUV420Plane(pC->pC1->m_pPreResizeFrame, - yuvFrameWidth, yuvFrameHeight); - } - } - else - { - M4OSA_TRACE3_0("M4VSS3GPP_intVPP: NO resize required"); - if (pC->nbActiveEffects > 0) { - /** If we do modify the image, we need an - * intermediate image plane */ - err = M4VSS3GPP_intAllocateYUV420(pTemp1, - pC->ewc.uiVideoWidth, - pC->ewc.uiVideoHeight); - if (M4NO_ERROR != err) { - pC->ewc.VppError = err; - return M4NO_ERROR; - } - pDecoderRenderFrame = pTemp1; - } - else { - pDecoderRenderFrame = pPlaneOut; - } - - pTmp = pPlaneOut; - err = pC->pC1->ShellAPI.m_pVideoDecoder->m_pFctRender( - pC->pC1->pViDecCtxt, &ts, - pDecoderRenderFrame, M4OSA_TRUE); - if (M4NO_ERROR != err) { - pC->ewc.VppError = err; - return M4NO_ERROR; - } - - if (pC->nbActiveEffects > 0) { - /* Here we do not skip the overlay effect since - * overlay and video frame are both of same resolution */ - bSkipFrameEffect = M4OSA_FALSE; - err = M4VSS3GPP_intApplyVideoEffect(pC, - pDecoderRenderFrame,pPlaneOut,bSkipFrameEffect); - } - if (M4NO_ERROR != err) { - pC->ewc.VppError = err; - return M4NO_ERROR; - } - } - pC->pC1->lastDecodedPlane = pTmp; - pC->pC1->iVideoRenderCts = (M4OSA_Int32)ts; - - } else { - M4OSA_TRACE3_0("M4VSS3GPP_intVPP: renderdup true"); - - if (M4OSA_NULL != pC->pC1->m_pPreResizeFrame) { - /** - * Copy last decoded plane to output plane */ - if (pC->pC1->lastDecodedPlane != M4OSA_NULL) { - - memcpy((void *)pC->pC1->m_pPreResizeFrame[0].pac_data, - (void *)pC->pC1->lastDecodedPlane[0].pac_data, - (pC->pC1->m_pPreResizeFrame[0].u_height * \ - pC->pC1->m_pPreResizeFrame[0].u_width)); - - memcpy((void *)pC->pC1->m_pPreResizeFrame[1].pac_data, - (void *)pC->pC1->lastDecodedPlane[1].pac_data, - (pC->pC1->m_pPreResizeFrame[1].u_height * \ - pC->pC1->m_pPreResizeFrame[1].u_width)); - - memcpy((void *)pC->pC1->m_pPreResizeFrame[2].pac_data, - (void *)pC->pC1->lastDecodedPlane[2].pac_data, - (pC->pC1->m_pPreResizeFrame[2].u_height * \ - pC->pC1->m_pPreResizeFrame[2].u_width)); - } else { - err = M4VSS3GPP_ERR_NO_VALID_VID_FRAME; - M4OSA_TRACE1_3("Can not find an input frame. Set error 0x%x in %s (%d)", - err, __FILE__, __LINE__); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - - if(pC->nbActiveEffects > 0) { - /** - * If we do modify the image, we need an - * intermediate image plane */ - err = M4VSS3GPP_intAllocateYUV420(pTemp1, - pC->pC1->m_pPreResizeFrame[0].u_width, - pC->pC1->m_pPreResizeFrame[0].u_height); - if (M4NO_ERROR != err) { - pC->ewc.VppError = err; - return M4NO_ERROR; - } - /* If video frame need to be resized, then apply the overlay after - * the frame was rendered with rendering mode. - * Here skip the framing(overlay) effect when applying video Effect. */ - bSkipFrameEffect = M4OSA_TRUE; - err = M4VSS3GPP_intApplyVideoEffect(pC, - pC->pC1->m_pPreResizeFrame,pTemp1, bSkipFrameEffect); - if (M4NO_ERROR != err) { - pC->ewc.VppError = err; - return M4NO_ERROR; - } - pDecoderRenderFrame= pTemp1; - } else { - pDecoderRenderFrame = pC->pC1->m_pPreResizeFrame; - } - /* Prepare overlay temporary buffer if overlay exist */ - if (pC->bClip1ActiveFramingEffect) { - err = M4VSS3GPP_intAllocateYUV420( - pTemp2, pC->ewc.uiVideoWidth, pC->ewc.uiVideoHeight); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: M4VSS3GPP_intAllocateYUV420 \ - returns 0x%x, returning M4NO_ERROR", err); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - pTmp = pTemp2; - } else { - pTmp = pPlaneOut; - } - /* Do rendering mode */ - err = M4VSS3GPP_intApplyRenderingMode(pC, - pC->pC1->pSettings->xVSS.MediaRendering, - pDecoderRenderFrame, pTmp); - if (M4NO_ERROR != err) { - pC->ewc.VppError = err; - return M4NO_ERROR; - } - /* Apply overlay if overlay is exist */ - pTmp = pPlaneOut; - if (pC->bClip1ActiveFramingEffect) { - err = M4VSS3GPP_intApplyVideoOverlay(pC, - pTemp2, pTmp); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ - M4VSS3GPP_intApplyRenderingMode) error 0x%x ", err); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - } - } else { - - err = M4VSS3GPP_intAllocateYUV420(pTemp1, - pC->ewc.uiVideoWidth, - pC->ewc.uiVideoHeight); - if (M4NO_ERROR != err) { - pC->ewc.VppError = err; - return M4NO_ERROR; - } - /** - * Copy last decoded plane to output plane */ - if (pC->pC1->lastDecodedPlane != M4OSA_NULL && - pLastDecodedFrame != M4OSA_NULL) { - memcpy((void *)pLastDecodedFrame[0].pac_data, - (void *)pC->pC1->lastDecodedPlane[0].pac_data, - (pLastDecodedFrame[0].u_height * pLastDecodedFrame[0].u_width)); - - memcpy((void *)pLastDecodedFrame[1].pac_data, - (void *)pC->pC1->lastDecodedPlane[1].pac_data, - (pLastDecodedFrame[1].u_height * pLastDecodedFrame[1].u_width)); - - memcpy((void *)pLastDecodedFrame[2].pac_data, - (void *)pC->pC1->lastDecodedPlane[2].pac_data, - (pLastDecodedFrame[2].u_height * pLastDecodedFrame[2].u_width)); - } else { - err = M4VSS3GPP_ERR_NO_VALID_VID_FRAME; - M4OSA_TRACE1_3("Can not find an input frame. Set error 0x%x in %s (%d)", - err, __FILE__, __LINE__); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - - pTmp = pPlaneOut; - /** - * Check if there is a effect */ - if(pC->nbActiveEffects > 0) { - /* Here we do not skip the overlay effect since - * overlay and video are both of same resolution */ - bSkipFrameEffect = M4OSA_FALSE; - err = M4VSS3GPP_intApplyVideoEffect(pC, - pLastDecodedFrame, pTmp,bSkipFrameEffect); - if (M4NO_ERROR != err) { - pC->ewc.VppError = err; - return M4NO_ERROR; - } - } - } - pC->pC1->lastDecodedPlane = pTmp; - } - - M4OSA_TRACE3_1("M4VSS3GPP_intVPP: Rendered at CTS %.3f", ts); - - for (i=0; i<3; i++) { - if (pTemp1[i].pac_data != M4OSA_NULL) { - free(pTemp1[i].pac_data); - pTemp1[i].pac_data = M4OSA_NULL; - } - } - for (i=0; i<3; i++) { - if (pTemp2[i].pac_data != M4OSA_NULL) { - free(pTemp2[i].pac_data); - pTemp2[i].pac_data = M4OSA_NULL; - } - } - } - - /** - * Return */ - M4OSA_TRACE3_0("M4VSS3GPP_intVPP: returning M4NO_ERROR"); - return M4NO_ERROR; -} -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intApplyVideoOverlay() - * @brief Apply video overlay from pPlaneIn to pPlaneOut - * @param pC (IN/OUT) Internal edit context - * @param pInputPlanes (IN) Input raw YUV420 image - * @param pOutputPlanes (IN/OUT) Output raw YUV420 image - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -static M4OSA_ERR -M4VSS3GPP_intApplyVideoOverlay (M4VSS3GPP_InternalEditContext *pC, - M4VIFI_ImagePlane *pPlaneIn, M4VIFI_ImagePlane *pPlaneOut) { - - M4VSS3GPP_ClipContext *pClip; - M4VSS3GPP_EffectSettings *pFx; - M4VSS3GPP_ExternalProgress extProgress; - M4OSA_Double VideoEffectTime; - M4OSA_Double PercentageDone; - M4OSA_UInt8 NumActiveEffects =0; - M4OSA_UInt32 Cts = 0; - M4OSA_Int32 nextEffectTime; - M4OSA_Int32 tmp; - M4OSA_UInt8 i; - M4OSA_ERR err; - - pClip = pC->pC1; - if (pC->bIssecondClip == M4OSA_TRUE) { - NumActiveEffects = pC->nbActiveEffects1; - } else { - NumActiveEffects = pC->nbActiveEffects; - } - for (i=0; i<NumActiveEffects; i++) { - if (pC->bIssecondClip == M4OSA_TRUE) { - pFx = &(pC->pEffectsList[pC->pActiveEffectsList1[i]]); - /* Compute how far from the beginning of the effect we are, in clip-base time. */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - VideoEffectTime = ((M4OSA_Int32)pC->ewc.dInputVidCts) + - pC->pTransitionList[pC->uiCurrentClip].uiTransitionDuration - pFx->uiStartTime; - } else { - pFx = &(pC->pEffectsList[pC->pActiveEffectsList[i]]); - /* Compute how far from the beginning of the effect we are, in clip-base time. */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - VideoEffectTime = ((M4OSA_Int32)pC->ewc.dInputVidCts) - pFx->uiStartTime; - } - /* Do the framing(overlay) effect only, - * skip other color effect which had been applied */ - if (pFx->xVSS.pFramingBuffer == M4OSA_NULL) { - continue; - } - - /* To calculate %, substract timeIncrement because effect should finish - * on the last frame which is presented from CTS = eof-timeIncrement till CTS = eof */ - PercentageDone = VideoEffectTime / ((M4OSA_Float)pFx->uiDuration); - - if (PercentageDone < 0.0) { - PercentageDone = 0.0; - } - if (PercentageDone > 1.0) { - PercentageDone = 1.0; - } - /** - * Compute where we are in the effect (scale is 0->1000) */ - tmp = (M4OSA_Int32)(PercentageDone * 1000); - - /** - * Set the progress info provided to the external function */ - extProgress.uiProgress = (M4OSA_UInt32)tmp; - // Decorrelate input and output encoding timestamp to handle encoder prefetch - extProgress.uiOutputTime = (M4OSA_UInt32)pC->ewc.dInputVidCts; - extProgress.uiClipTime = extProgress.uiOutputTime - pClip->iVoffset; - extProgress.bIsLast = M4OSA_FALSE; - // Decorrelate input and output encoding timestamp to handle encoder prefetch - nextEffectTime = (M4OSA_Int32)(pC->ewc.dInputVidCts \ - + pC->dOutputFrameDuration); - if (nextEffectTime >= (M4OSA_Int32)(pFx->uiStartTime + pFx->uiDuration)) { - extProgress.bIsLast = M4OSA_TRUE; - } - err = pFx->ExtVideoEffectFct(pFx->pExtVideoEffectFctCtxt, - pPlaneIn, pPlaneOut, &extProgress, - pFx->VideoEffectType - M4VSS3GPP_kVideoEffectType_External); - - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1( - "M4VSS3GPP_intApplyVideoOverlay: \ - External video effect function returns 0x%x!", - err); - return err; - } - } - - /** - * Return */ - M4OSA_TRACE3_0("M4VSS3GPP_intApplyVideoOverlay: returning M4NO_ERROR"); - return M4NO_ERROR; -} -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intApplyVideoEffect() - * @brief Apply video effect from pPlaneIn to pPlaneOut - * @param pC (IN/OUT) Internal edit context - * @param uiClip1orClip2 (IN/OUT) 1 for first clip, 2 for second clip - * @param pInputPlanes (IN) Input raw YUV420 image - * @param pOutputPlanes (IN/OUT) Output raw YUV420 image - * @param bSkipFramingEffect (IN) skip framing effect flag - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -static M4OSA_ERR -M4VSS3GPP_intApplyVideoEffect (M4VSS3GPP_InternalEditContext *pC, - M4VIFI_ImagePlane *pPlaneIn, M4VIFI_ImagePlane *pPlaneOut, - M4OSA_Bool bSkipFramingEffect) { - - M4OSA_ERR err; - - M4VSS3GPP_ClipContext *pClip; - M4VSS3GPP_EffectSettings *pFx; - M4VSS3GPP_ExternalProgress extProgress; - - M4OSA_Double VideoEffectTime; - M4OSA_Double PercentageDone; - M4OSA_Int32 tmp; - - M4VIFI_ImagePlane *pPlaneTempIn; - M4VIFI_ImagePlane *pPlaneTempOut; - M4VIFI_ImagePlane pTempYuvPlane[3]; - M4OSA_UInt8 i; - M4OSA_UInt8 NumActiveEffects =0; - - - pClip = pC->pC1; - if (pC->bIssecondClip == M4OSA_TRUE) - { - NumActiveEffects = pC->nbActiveEffects1; - } - else - { - NumActiveEffects = pC->nbActiveEffects; - } - - memset((void *)pTempYuvPlane, 0, 3*sizeof(M4VIFI_ImagePlane)); - - /** - * Allocate temporary plane if needed RC */ - if (NumActiveEffects > 1) { - err = M4VSS3GPP_intAllocateYUV420(pTempYuvPlane, pPlaneOut->u_width, - pPlaneOut->u_height); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intApplyVideoEffect: M4VSS3GPP_intAllocateYUV420(4) returns 0x%x,\ - returning M4NO_ERROR", - err); - pC->ewc.VppError = err; - return - M4NO_ERROR; /**< Return no error to the encoder core - (else it may leak in some situations...) */ - } - } - - if (NumActiveEffects % 2 == 0) - { - pPlaneTempIn = pPlaneIn; - pPlaneTempOut = pTempYuvPlane; - } - else - { - pPlaneTempIn = pPlaneIn; - pPlaneTempOut = pPlaneOut; - } - - for (i=0; i<NumActiveEffects; i++) - { - if (pC->bIssecondClip == M4OSA_TRUE) - { - - - pFx = &(pC->pEffectsList[pC->pActiveEffectsList1[i]]); - /* Compute how far from the beginning of the effect we are, in clip-base time. */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - VideoEffectTime = ((M4OSA_Int32)pC->ewc.dInputVidCts) + - pC->pTransitionList[pC->uiCurrentClip]. - uiTransitionDuration- pFx->uiStartTime; - } - else - { - pFx = &(pC->pEffectsList[pC->pActiveEffectsList[i]]); - /* Compute how far from the beginning of the effect we are, in clip-base time. */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - VideoEffectTime = ((M4OSA_Int32)pC->ewc.dInputVidCts) - pFx->uiStartTime; - } - - - - /* To calculate %, substract timeIncrement because effect should finish on the last frame*/ - /* which is presented from CTS = eof-timeIncrement till CTS = eof */ - PercentageDone = VideoEffectTime - / ((M4OSA_Float)pFx->uiDuration/*- pC->dOutputFrameDuration*/); - - if( PercentageDone < 0.0 ) - PercentageDone = 0.0; - - if( PercentageDone > 1.0 ) - PercentageDone = 1.0; - - switch( pFx->VideoEffectType ) - { - case M4VSS3GPP_kVideoEffectType_FadeFromBlack: - /** - * Compute where we are in the effect (scale is 0->1024). */ - tmp = (M4OSA_Int32)(PercentageDone * 1024); - - /** - * Apply the darkening effect */ - err = - M4VFL_modifyLumaWithScale((M4ViComImagePlane *)pPlaneTempIn, - (M4ViComImagePlane *)pPlaneTempOut, tmp, M4OSA_NULL); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intApplyVideoEffect:\ - M4VFL_modifyLumaWithScale returns error 0x%x,\ - returning M4VSS3GPP_ERR_LUMA_FILTER_ERROR", - err); - return M4VSS3GPP_ERR_LUMA_FILTER_ERROR; - } - break; - - case M4VSS3GPP_kVideoEffectType_FadeToBlack: - /** - * Compute where we are in the effect (scale is 0->1024) */ - tmp = (M4OSA_Int32)(( 1.0 - PercentageDone) * 1024); - - /** - * Apply the darkening effect */ - err = - M4VFL_modifyLumaWithScale((M4ViComImagePlane *)pPlaneTempIn, - (M4ViComImagePlane *)pPlaneTempOut, tmp, M4OSA_NULL); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intApplyVideoEffect:\ - M4VFL_modifyLumaWithScale returns error 0x%x,\ - returning M4VSS3GPP_ERR_LUMA_FILTER_ERROR", - err); - return M4VSS3GPP_ERR_LUMA_FILTER_ERROR; - } - break; - - default: - if( pFx->VideoEffectType - >= M4VSS3GPP_kVideoEffectType_External ) - { - M4OSA_UInt32 Cts = 0; - M4OSA_Int32 nextEffectTime; - - /** - * Compute where we are in the effect (scale is 0->1000) */ - tmp = (M4OSA_Int32)(PercentageDone * 1000); - - /** - * Set the progress info provided to the external function */ - extProgress.uiProgress = (M4OSA_UInt32)tmp; - // Decorrelate input and output encoding timestamp to handle encoder prefetch - extProgress.uiOutputTime = (M4OSA_UInt32)pC->ewc.dInputVidCts; - extProgress.uiClipTime = extProgress.uiOutputTime - pClip->iVoffset; - extProgress.bIsLast = M4OSA_FALSE; - // Decorrelate input and output encoding timestamp to handle encoder prefetch - nextEffectTime = (M4OSA_Int32)(pC->ewc.dInputVidCts \ - + pC->dOutputFrameDuration); - if(nextEffectTime >= (M4OSA_Int32)(pFx->uiStartTime + pFx->uiDuration)) - { - extProgress.bIsLast = M4OSA_TRUE; - } - /* Here skip the framing effect, - * do the framing effect after apply rendering mode */ - if ((pFx->xVSS.pFramingBuffer != M4OSA_NULL) && - bSkipFramingEffect == M4OSA_TRUE) { - memcpy(pPlaneTempOut[0].pac_data, pPlaneTempIn[0].pac_data, - pPlaneTempIn[0].u_height * pPlaneTempIn[0].u_width); - memcpy(pPlaneTempOut[1].pac_data, pPlaneTempIn[1].pac_data, - pPlaneTempIn[1].u_height * pPlaneTempIn[1].u_width); - memcpy(pPlaneTempOut[2].pac_data, pPlaneTempIn[2].pac_data, - pPlaneTempIn[2].u_height * pPlaneTempIn[2].u_width); - - } else { - err = pFx->ExtVideoEffectFct(pFx->pExtVideoEffectFctCtxt, - pPlaneTempIn, pPlaneTempOut, &extProgress, - pFx->VideoEffectType - - M4VSS3GPP_kVideoEffectType_External); - } - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intApplyVideoEffect: \ - External video effect function returns 0x%x!", - err); - return err; - } - break; - } - else - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intApplyVideoEffect: unknown effect type (0x%x),\ - returning M4VSS3GPP_ERR_INVALID_VIDEO_EFFECT_TYPE", - pFx->VideoEffectType); - return M4VSS3GPP_ERR_INVALID_VIDEO_EFFECT_TYPE; - } - } - /** - * RC Updates pTempPlaneIn and pTempPlaneOut depending on current effect */ - if (((i % 2 == 0) && (NumActiveEffects % 2 == 0)) - || ((i % 2 != 0) && (NumActiveEffects % 2 != 0))) - { - pPlaneTempIn = pTempYuvPlane; - pPlaneTempOut = pPlaneOut; - } - else - { - pPlaneTempIn = pPlaneOut; - pPlaneTempOut = pTempYuvPlane; - } - } - - for(i=0; i<3; i++) { - if(pTempYuvPlane[i].pac_data != M4OSA_NULL) { - free(pTempYuvPlane[i].pac_data); - pTempYuvPlane[i].pac_data = M4OSA_NULL; - } - } - - /** - * Return */ - M4OSA_TRACE3_0("M4VSS3GPP_intApplyVideoEffect: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intVideoTransition() - * @brief Apply video transition effect pC1+pC2->pPlaneOut - * @param pC (IN/OUT) Internal edit context - * @param pOutputPlanes (IN/OUT) Output raw YUV420 image - * @return M4NO_ERROR: No error - ****************************************************************************** - */ -static M4OSA_ERR -M4VSS3GPP_intVideoTransition( M4VSS3GPP_InternalEditContext *pC, - M4VIFI_ImagePlane *pPlaneOut ) -{ - M4OSA_ERR err; - M4OSA_Int32 iProgress; - M4VSS3GPP_ExternalProgress extProgress; - M4VIFI_ImagePlane *pPlane; - M4OSA_Int32 i; - const M4OSA_Int32 iDur = (M4OSA_Int32)pC-> - pTransitionList[pC->uiCurrentClip].uiTransitionDuration; - - /** - * Compute how far from the end cut we are, in clip-base time. - * It is done with integers because the offset and begin cut have been rounded already. */ - // Decorrelate input and output encoding timestamp to handle encoder prefetch - iProgress = (M4OSA_Int32)((M4OSA_Double)pC->pC1->iEndTime) - pC->ewc.dInputVidCts + - ((M4OSA_Double)pC->pC1->iVoffset); - /** - * We must remove the duration of one frame, else we would almost never reach the end - * (It's kind of a "pile and intervals" issue). */ - iProgress -= (M4OSA_Int32)pC->dOutputFrameDuration; - - if( iProgress < 0 ) /**< Sanity checks */ - { - iProgress = 0; - } - - /** - * Compute where we are in the transition, on a base 1000 */ - iProgress = ( ( iDur - iProgress) * 1000) / iDur; - - /** - * Sanity checks */ - if( iProgress < 0 ) - { - iProgress = 0; - } - else if( iProgress > 1000 ) - { - iProgress = 1000; - } - - switch( pC->pTransitionList[pC->uiCurrentClip].TransitionBehaviour ) - { - case M4VSS3GPP_TransitionBehaviour_SpeedUp: - iProgress = ( iProgress * iProgress) / 1000; - break; - - case M4VSS3GPP_TransitionBehaviour_Linear: - /*do nothing*/ - break; - - case M4VSS3GPP_TransitionBehaviour_SpeedDown: - iProgress = (M4OSA_Int32)(sqrt(iProgress * 1000)); - break; - - case M4VSS3GPP_TransitionBehaviour_SlowMiddle: - if( iProgress < 500 ) - { - iProgress = (M4OSA_Int32)(sqrt(iProgress * 500)); - } - else - { - iProgress = - (M4OSA_Int32)(( ( ( iProgress - 500) * (iProgress - 500)) - / 500) + 500); - } - break; - - case M4VSS3GPP_TransitionBehaviour_FastMiddle: - if( iProgress < 500 ) - { - iProgress = (M4OSA_Int32)(( iProgress * iProgress) / 500); - } - else - { - iProgress = (M4OSA_Int32)(sqrt(( iProgress - 500) * 500) + 500); - } - break; - - default: - /*do nothing*/ - break; - } - - switch( pC->pTransitionList[pC->uiCurrentClip].VideoTransitionType ) - { - case M4VSS3GPP_kVideoTransitionType_CrossFade: - /** - * Apply the transition effect */ - err = M4VIFI_ImageBlendingonYUV420(M4OSA_NULL, - (M4ViComImagePlane *)pC->yuv1, - (M4ViComImagePlane *)pC->yuv2, - (M4ViComImagePlane *)pPlaneOut, iProgress); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intVideoTransition:\ - M4VIFI_ImageBlendingonYUV420 returns error 0x%x,\ - returning M4VSS3GPP_ERR_TRANSITION_FILTER_ERROR", - err); - return M4VSS3GPP_ERR_TRANSITION_FILTER_ERROR; - } - break; - - case M4VSS3GPP_kVideoTransitionType_None: - /** - * This is a stupid-non optimized version of the None transition... - * We copy the YUV frame */ - if( iProgress < 500 ) /**< first half of transition */ - { - pPlane = pC->yuv1; - } - else /**< second half of transition */ - { - pPlane = pC->yuv2; - } - /** - * Copy the input YUV frames */ - i = 3; - - while( i-- > 0 ) - { - memcpy((void *)pPlaneOut[i].pac_data, - (void *)pPlane[i].pac_data, - pPlaneOut[i].u_stride * pPlaneOut[i].u_height); - } - break; - - default: - if( pC->pTransitionList[pC->uiCurrentClip].VideoTransitionType - >= M4VSS3GPP_kVideoTransitionType_External ) - { - /** - * Set the progress info provided to the external function */ - extProgress.uiProgress = (M4OSA_UInt32)iProgress; - // Decorrelate input and output encoding timestamp to handle encoder prefetch - extProgress.uiOutputTime = (M4OSA_UInt32)pC->ewc.dInputVidCts; - extProgress.uiClipTime = extProgress.uiOutputTime - pC->pC1->iVoffset; - - err = pC->pTransitionList[pC-> - uiCurrentClip].ExtVideoTransitionFct( - pC->pTransitionList[pC-> - uiCurrentClip].pExtVideoTransitionFctCtxt, - pC->yuv1, pC->yuv2, pPlaneOut, &extProgress, - pC->pTransitionList[pC-> - uiCurrentClip].VideoTransitionType - - M4VSS3GPP_kVideoTransitionType_External); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intVideoTransition:\ - External video transition function returns 0x%x!", - err); - return err; - } - break; - } - else - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intVideoTransition: unknown transition type (0x%x),\ - returning M4VSS3GPP_ERR_INVALID_VIDEO_TRANSITION_TYPE", - pC->pTransitionList[pC->uiCurrentClip].VideoTransitionType); - return M4VSS3GPP_ERR_INVALID_VIDEO_TRANSITION_TYPE; - } - } - - /** - * Return */ - M4OSA_TRACE3_0("M4VSS3GPP_intVideoTransition: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_Void M4VSS3GPP_intUpdateTimeInfo() - * @brief Update bit stream time info by Counter Time System to be compliant with - * players using bit stream time info - * @note H263 uses an absolute time counter unlike MPEG4 which uses Group Of Vops - * (GOV, see the standard) - * @param pC (IN/OUT) returns time updated video AU, - * the offset between system and video time (MPEG4 only) - * and the state of the current clip (MPEG4 only) - * @return nothing - ****************************************************************************** - */ -static M4OSA_Void -M4VSS3GPP_intUpdateTimeInfo( M4VSS3GPP_InternalEditContext *pC, - M4SYS_AccessUnit *pAU ) -{ - M4OSA_UInt8 uiTmp; - M4OSA_UInt32 uiCts = 0; - M4OSA_MemAddr8 pTmp; - M4OSA_UInt32 uiAdd; - M4OSA_UInt32 uiCurrGov; - M4OSA_Int8 iDiff; - - M4VSS3GPP_ClipContext *pClipCtxt = pC->pC1; - M4OSA_Int32 *pOffset = &(pC->ewc.iMpeg4GovOffset); - - /** - * Set H263 time counter from system time */ - if( M4SYS_kH263 == pAU->stream->streamType ) - { - uiTmp = (M4OSA_UInt8)((M4OSA_UInt32)( ( pAU->CTS * 30) / 1001 + 0.5) - % M4VSS3GPP_EDIT_H263_MODULO_TIME); - M4VSS3GPP_intSetH263TimeCounter((M4OSA_MemAddr8)(pAU->dataAddress), - uiTmp); - } - /* - * Set MPEG4 GOV time counter regarding video and system time */ - else if( M4SYS_kMPEG_4 == pAU->stream->streamType ) - { - /* - * If GOV. - * beware of little/big endian! */ - /* correction: read 8 bits block instead of one 32 bits block */ - M4OSA_UInt8 *temp8 = (M4OSA_UInt8 *)(pAU->dataAddress); - M4OSA_UInt32 temp32 = 0; - - temp32 = ( 0x000000ff & (M4OSA_UInt32)(*temp8)) - + (0x0000ff00 & ((M4OSA_UInt32)(*(temp8 + 1))) << 8) - + (0x00ff0000 & ((M4OSA_UInt32)(*(temp8 + 2))) << 16) - + (0xff000000 & ((M4OSA_UInt32)(*(temp8 + 3))) << 24); - - M4OSA_TRACE3_2("RC: Temp32: 0x%x, dataAddress: 0x%x\n", temp32, - *(pAU->dataAddress)); - - if( M4VSS3GPP_EDIT_GOV_HEADER == temp32 ) - { - pTmp = - (M4OSA_MemAddr8)(pAU->dataAddress - + 1); /**< Jump to the time code (just after the 32 bits header) */ - uiAdd = (M4OSA_UInt32)(pAU->CTS)+( *pOffset); - - switch( pClipCtxt->bMpeg4GovState ) - { - case M4OSA_FALSE: /*< INIT */ - { - /* video time = ceil (system time + offset) */ - uiCts = ( uiAdd + 999) / 1000; - - /* offset update */ - ( *pOffset) += (( uiCts * 1000) - uiAdd); - - /* Save values */ - pClipCtxt->uiMpeg4PrevGovValueSet = uiCts; - - /* State to 'first' */ - pClipCtxt->bMpeg4GovState = M4OSA_TRUE; - } - break; - - case M4OSA_TRUE: /*< UPDATE */ - { - /* Get current Gov value */ - M4VSS3GPP_intGetMPEG4Gov(pTmp, &uiCurrGov); - - /* video time = floor or ceil (system time + offset) */ - uiCts = (uiAdd / 1000); - iDiff = (M4OSA_Int8)(uiCurrGov - - pClipCtxt->uiMpeg4PrevGovValueGet - uiCts - + pClipCtxt->uiMpeg4PrevGovValueSet); - - /* ceiling */ - if( iDiff > 0 ) - { - uiCts += (M4OSA_UInt32)(iDiff); - - /* offset update */ - ( *pOffset) += (( uiCts * 1000) - uiAdd); - } - - /* Save values */ - pClipCtxt->uiMpeg4PrevGovValueGet = uiCurrGov; - pClipCtxt->uiMpeg4PrevGovValueSet = uiCts; - } - break; - } - - M4VSS3GPP_intSetMPEG4Gov(pTmp, uiCts); - } - } - return; -} - -/** - ****************************************************************************** - * M4OSA_Void M4VSS3GPP_intCheckVideoEffects() - * @brief Check which video effect must be applied at the current time - ****************************************************************************** - */ -static M4OSA_Void -M4VSS3GPP_intCheckVideoEffects( M4VSS3GPP_InternalEditContext *pC, - M4OSA_UInt8 uiClipNumber ) -{ - M4OSA_UInt8 uiClipIndex; - M4OSA_UInt8 uiFxIndex, i; - M4VSS3GPP_ClipContext *pClip; - M4VSS3GPP_EffectSettings *pFx; - M4OSA_Int32 Off, BC, EC; - // Decorrelate input and output encoding timestamp to handle encoder prefetch - M4OSA_Int32 t = (M4OSA_Int32)pC->ewc.dInputVidCts; - - uiClipIndex = pC->uiCurrentClip; - if (uiClipNumber == 1) { - pClip = pC->pC1; - pC->bClip1ActiveFramingEffect = M4OSA_FALSE; - } else { - pClip = pC->pC2; - pC->bClip2ActiveFramingEffect = M4OSA_FALSE; - } - /** - * Shortcuts for code readability */ - Off = pClip->iVoffset; - BC = pClip->iActualVideoBeginCut; - EC = pClip->iEndTime; - - i = 0; - - for ( uiFxIndex = 0; uiFxIndex < pC->nbEffects; uiFxIndex++ ) - { - /** Shortcut, reverse order because of priority between effects(EndEffect always clean )*/ - pFx = &(pC->pEffectsList[pC->nbEffects - 1 - uiFxIndex]); - - if( M4VSS3GPP_kVideoEffectType_None != pFx->VideoEffectType ) - { - /** - * Check if there is actually a video effect */ - - if(uiClipNumber ==1) - { - /**< Are we after the start time of the effect? - * or Are we into the effect duration? - */ - if ( (t >= (M4OSA_Int32)(pFx->uiStartTime)) && - (t <= (M4OSA_Int32)(pFx->uiStartTime + pFx->uiDuration)) ) { - /** - * Set the active effect(s) */ - pC->pActiveEffectsList[i] = pC->nbEffects-1-uiFxIndex; - - /** - * Update counter of active effects */ - i++; - if (pFx->xVSS.pFramingBuffer != M4OSA_NULL) { - pC->bClip1ActiveFramingEffect = M4OSA_TRUE; - } - - /** - * For all external effects set this flag to true. */ - if(pFx->VideoEffectType > M4VSS3GPP_kVideoEffectType_External) - { - pC->m_bClipExternalHasStarted = M4OSA_TRUE; - } - } - - } - else - { - /**< Are we into the effect duration? */ - if ( ((M4OSA_Int32)(t + pC->pTransitionList[uiClipIndex].uiTransitionDuration) - >= (M4OSA_Int32)(pFx->uiStartTime)) - && ( (M4OSA_Int32)(t + pC->pTransitionList[uiClipIndex].uiTransitionDuration) - <= (M4OSA_Int32)(pFx->uiStartTime + pFx->uiDuration)) ) { - /** - * Set the active effect(s) */ - pC->pActiveEffectsList1[i] = pC->nbEffects-1-uiFxIndex; - - /** - * Update counter of active effects */ - i++; - if (pFx->xVSS.pFramingBuffer != M4OSA_NULL) { - pC->bClip2ActiveFramingEffect = M4OSA_TRUE; - } - /** - * For all external effects set this flag to true. */ - if(pFx->VideoEffectType > M4VSS3GPP_kVideoEffectType_External) - { - pC->m_bClipExternalHasStarted = M4OSA_TRUE; - } - - /** - * The third effect has the highest priority, then the second one, then the first one. - * Hence, as soon as we found an active effect, we can get out of this loop */ - } - } - if (M4VIDEOEDITING_kH264 != - pC->pC1->pSettings->ClipProperties.VideoStreamType) { - - // For Mpeg4 and H263 clips, full decode encode not required - pC->m_bClipExternalHasStarted = M4OSA_FALSE; - } - } - } - if(1==uiClipNumber) - { - /** - * Save number of active effects */ - pC->nbActiveEffects = i; - } - else - { - pC->nbActiveEffects1 = i; - } - - /** - * Change the absolut time to clip related time */ - t -= Off; - - /** - * Check if we are on the begin cut (for clip1 only) */ - if( ( 0 != BC) && (t == BC) && (1 == uiClipNumber) ) - { - pC->bClip1AtBeginCut = M4OSA_TRUE; - } - else - { - pC->bClip1AtBeginCut = M4OSA_FALSE; - } - - return; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intCreateVideoEncoder() - * @brief Creates the video encoder - * @note - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intCreateVideoEncoder( M4VSS3GPP_InternalEditContext *pC ) -{ - M4OSA_ERR err; - M4ENCODER_AdvancedParams EncParams; - - /** - * Simulate a writer interface with our specific function */ - pC->ewc.OurWriterDataInterface.pProcessAU = - M4VSS3GPP_intProcessAU; /**< This function is VSS 3GPP specific, - but it follow the writer interface */ - pC->ewc.OurWriterDataInterface.pStartAU = - M4VSS3GPP_intStartAU; /**< This function is VSS 3GPP specific, - but it follow the writer interface */ - pC->ewc.OurWriterDataInterface.pWriterContext = - (M4WRITER_Context) - pC; /**< We give the internal context as writer context */ - - /** - * Get the encoder interface, if not already done */ - if( M4OSA_NULL == pC->ShellAPI.pVideoEncoderGlobalFcts ) - { - err = M4VSS3GPP_setCurrentVideoEncoder(&pC->ShellAPI, - pC->ewc.VideoStreamType); - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreateVideoEncoder: setCurrentEncoder returns 0x%x", - err); - M4ERR_CHECK_RETURN(err); - } - - /** - * Set encoder shell parameters according to VSS settings */ - - /* Common parameters */ - EncParams.InputFormat = M4ENCODER_kIYUV420; - EncParams.FrameWidth = pC->ewc.uiVideoWidth; - EncParams.FrameHeight = pC->ewc.uiVideoHeight; - EncParams.uiTimeScale = pC->ewc.uiVideoTimeScale; - - if( pC->bIsMMS == M4OSA_FALSE ) - { - /* No strict regulation in video editor */ - /* Because of the effects and transitions we should allow more flexibility */ - /* Also it prevents to drop important frames (with a bad result on sheduling and - block effetcs) */ - EncParams.bInternalRegulation = M4OSA_FALSE; - // Variable framerate is not supported by StageFright encoders - EncParams.FrameRate = M4ENCODER_k30_FPS; - } - else - { - /* In case of MMS mode, we need to enable bitrate regulation to be sure */ - /* to reach the targeted output file size */ - EncParams.bInternalRegulation = M4OSA_TRUE; - EncParams.FrameRate = pC->MMSvideoFramerate; - } - - /** - * Other encoder settings (defaults) */ - EncParams.uiHorizontalSearchRange = 0; /* use default */ - EncParams.uiVerticalSearchRange = 0; /* use default */ - EncParams.bErrorResilience = M4OSA_FALSE; /* no error resilience */ - EncParams.uiIVopPeriod = 0; /* use default */ - EncParams.uiMotionEstimationTools = 0; /* M4V_MOTION_EST_TOOLS_ALL */ - EncParams.bAcPrediction = M4OSA_TRUE; /* use AC prediction */ - EncParams.uiStartingQuantizerValue = 10; /* initial QP = 10 */ - EncParams.bDataPartitioning = M4OSA_FALSE; /* no data partitioning */ - - /** - * Set the video profile and level */ - EncParams.videoProfile = pC->ewc.outputVideoProfile; - EncParams.videoLevel= pC->ewc.outputVideoLevel; - - switch ( pC->ewc.VideoStreamType ) - { - case M4SYS_kH263: - - EncParams.Format = M4ENCODER_kH263; - - EncParams.uiStartingQuantizerValue = 10; - EncParams.uiRateFactor = 1; /* default */ - - EncParams.bErrorResilience = M4OSA_FALSE; - EncParams.bDataPartitioning = M4OSA_FALSE; - break; - - case M4SYS_kMPEG_4: - - EncParams.Format = M4ENCODER_kMPEG4; - - EncParams.uiStartingQuantizerValue = 8; - EncParams.uiRateFactor = (M4OSA_UInt8)(( pC->dOutputFrameDuration - * pC->ewc.uiVideoTimeScale) / 1000.0 + 0.5); - - if( EncParams.uiRateFactor == 0 ) - EncParams.uiRateFactor = 1; /* default */ - - if( M4OSA_FALSE == pC->ewc.bVideoDataPartitioning ) - { - EncParams.bErrorResilience = M4OSA_FALSE; - EncParams.bDataPartitioning = M4OSA_FALSE; - } - else - { - EncParams.bErrorResilience = M4OSA_TRUE; - EncParams.bDataPartitioning = M4OSA_TRUE; - } - break; - - case M4SYS_kH264: - M4OSA_TRACE1_0("M4VSS3GPP_intCreateVideoEncoder: M4SYS_H264"); - - EncParams.Format = M4ENCODER_kH264; - - EncParams.uiStartingQuantizerValue = 10; - EncParams.uiRateFactor = 1; /* default */ - - EncParams.bErrorResilience = M4OSA_FALSE; - EncParams.bDataPartitioning = M4OSA_FALSE; - //EncParams.FrameRate = M4VIDEOEDITING_k5_FPS; - break; - - default: - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreateVideoEncoder: Unknown videoStreamType 0x%x", - pC->ewc.VideoStreamType); - return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT; - } - - if( pC->bIsMMS == M4OSA_FALSE ) - { - EncParams.Bitrate = pC->xVSS.outputVideoBitrate; - - } - else - { - EncParams.Bitrate = pC->uiMMSVideoBitrate; /* RC */ - EncParams.uiTimeScale = 0; /* We let the encoder choose the timescale */ - } - - M4OSA_TRACE1_0("M4VSS3GPP_intCreateVideoEncoder: calling encoder pFctInit"); - /** - * Init the video encoder (advanced settings version of the encoder Open function) */ - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctInit(&pC->ewc.pEncContext, - &pC->ewc.OurWriterDataInterface, M4VSS3GPP_intVPP, pC, - pC->ShellAPI.pCurrentVideoEncoderExternalAPI, - pC->ShellAPI.pCurrentVideoEncoderUserData); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreateVideoEncoder: pVideoEncoderGlobalFcts->pFctInit returns 0x%x", - err); - return err; - } - - pC->ewc.encoderState = M4VSS3GPP_kEncoderClosed; - M4OSA_TRACE1_0("M4VSS3GPP_intCreateVideoEncoder: calling encoder pFctOpen"); - - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctOpen(pC->ewc.pEncContext, - &pC->ewc.WriterVideoAU, &EncParams); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreateVideoEncoder: pVideoEncoderGlobalFcts->pFctOpen returns 0x%x", - err); - return err; - } - - pC->ewc.encoderState = M4VSS3GPP_kEncoderStopped; - M4OSA_TRACE1_0( - "M4VSS3GPP_intCreateVideoEncoder: calling encoder pFctStart"); - - if( M4OSA_NULL != pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStart ) - { - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStart( - pC->ewc.pEncContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intCreateVideoEncoder: pVideoEncoderGlobalFcts->pFctStart returns 0x%x", - err); - return err; - } - } - - pC->ewc.encoderState = M4VSS3GPP_kEncoderRunning; - - /** - * Return */ - M4OSA_TRACE3_0("M4VSS3GPP_intCreateVideoEncoder: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intDestroyVideoEncoder() - * @brief Destroy the video encoder - * @note - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_intDestroyVideoEncoder( M4VSS3GPP_InternalEditContext *pC ) -{ - M4OSA_ERR err = M4NO_ERROR; - - if( M4OSA_NULL != pC->ewc.pEncContext ) - { - if( M4VSS3GPP_kEncoderRunning == pC->ewc.encoderState ) - { - if( pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStop != M4OSA_NULL ) - { - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctStop( - pC->ewc.pEncContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intDestroyVideoEncoder:\ - pVideoEncoderGlobalFcts->pFctStop returns 0x%x", - err); - /* Well... how the heck do you handle a failed cleanup? */ - } - } - - pC->ewc.encoderState = M4VSS3GPP_kEncoderStopped; - } - - /* Has the encoder actually been opened? Don't close it if that's not the case. */ - if( M4VSS3GPP_kEncoderStopped == pC->ewc.encoderState ) - { - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctClose( - pC->ewc.pEncContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intDestroyVideoEncoder:\ - pVideoEncoderGlobalFcts->pFctClose returns 0x%x", - err); - /* Well... how the heck do you handle a failed cleanup? */ - } - - pC->ewc.encoderState = M4VSS3GPP_kEncoderClosed; - } - - err = pC->ShellAPI.pVideoEncoderGlobalFcts->pFctCleanup( - pC->ewc.pEncContext); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_intDestroyVideoEncoder:\ - pVideoEncoderGlobalFcts->pFctCleanup returns 0x%x!", - err); - /**< We do not return the error here because we still have stuff to free */ - } - - pC->ewc.encoderState = M4VSS3GPP_kNoEncoder; - /** - * Reset variable */ - pC->ewc.pEncContext = M4OSA_NULL; - } - - M4OSA_TRACE3_1("M4VSS3GPP_intDestroyVideoEncoder: returning 0x%x", err); - return err; -} - -/** - ****************************************************************************** - * M4OSA_Void M4VSS3GPP_intSetH263TimeCounter() - * @brief Modify the time counter of the given H263 video AU - * @note - * @param pAuDataBuffer (IN/OUT) H263 Video AU to modify - * @param uiCts (IN) New time counter value - * @return nothing - ****************************************************************************** - */ -static M4OSA_Void M4VSS3GPP_intSetH263TimeCounter( M4OSA_MemAddr8 pAuDataBuffer, - M4OSA_UInt8 uiCts ) -{ - /* - * The H263 time counter is 8 bits located on the "x" below: - * - * |--------|--------|--------|--------| - * ???????? ???????? ??????xx xxxxxx?? - */ - - /** - * Write the 2 bits on the third byte */ - pAuDataBuffer[2] = ( pAuDataBuffer[2] & 0xFC) | (( uiCts >> 6) & 0x3); - - /** - * Write the 6 bits on the fourth byte */ - pAuDataBuffer[3] = ( ( uiCts << 2) & 0xFC) | (pAuDataBuffer[3] & 0x3); - - return; -} - -/** - ****************************************************************************** - * M4OSA_Void M4VSS3GPP_intSetMPEG4Gov() - * @brief Modify the time info from Group Of VOP video AU - * @note - * @param pAuDataBuffer (IN) MPEG4 Video AU to modify - * @param uiCtsSec (IN) New GOV time info in second unit - * @return nothing - ****************************************************************************** - */ -static M4OSA_Void M4VSS3GPP_intSetMPEG4Gov( M4OSA_MemAddr8 pAuDataBuffer, - M4OSA_UInt32 uiCtsSec ) -{ - /* - * The MPEG-4 time code length is 18 bits: - * - * hh mm marker ss - * xxxxx|xxx xxx 1 xxxx xx ?????? - * |----- ---|--- - ----|-- ------| - */ - M4OSA_UInt8 uiHh; - M4OSA_UInt8 uiMm; - M4OSA_UInt8 uiSs; - M4OSA_UInt8 uiTmp; - - /** - * Write the 2 last bits ss */ - uiSs = (M4OSA_UInt8)(uiCtsSec % 60); /**< modulo part */ - pAuDataBuffer[2] = (( ( uiSs & 0x03) << 6) | (pAuDataBuffer[2] & 0x3F)); - - if( uiCtsSec < 60 ) - { - /** - * Write the 3 last bits of mm, the marker bit (0x10 */ - pAuDataBuffer[1] = (( 0x10) | (uiSs >> 2)); - - /** - * Write the 5 bits of hh and 3 of mm (out of 6) */ - pAuDataBuffer[0] = 0; - } - else - { - /** - * Write the 3 last bits of mm, the marker bit (0x10 */ - uiTmp = (M4OSA_UInt8)(uiCtsSec / 60); /**< integer part */ - uiMm = (M4OSA_UInt8)(uiTmp % 60); - pAuDataBuffer[1] = (( uiMm << 5) | (0x10) | (uiSs >> 2)); - - if( uiTmp < 60 ) - { - /** - * Write the 5 bits of hh and 3 of mm (out of 6) */ - pAuDataBuffer[0] = ((uiMm >> 3)); - } - else - { - /** - * Write the 5 bits of hh and 3 of mm (out of 6) */ - uiHh = (M4OSA_UInt8)(uiTmp / 60); - pAuDataBuffer[0] = (( uiHh << 3) | (uiMm >> 3)); - } - } - return; -} - -/** - ****************************************************************************** - * M4OSA_Void M4VSS3GPP_intGetMPEG4Gov() - * @brief Get the time info from Group Of VOP video AU - * @note - * @param pAuDataBuffer (IN) MPEG4 Video AU to modify - * @param pCtsSec (OUT) Current GOV time info in second unit - * @return nothing - ****************************************************************************** - */ -static M4OSA_Void M4VSS3GPP_intGetMPEG4Gov( M4OSA_MemAddr8 pAuDataBuffer, - M4OSA_UInt32 *pCtsSec ) -{ - /* - * The MPEG-4 time code length is 18 bits: - * - * hh mm marker ss - * xxxxx|xxx xxx 1 xxxx xx ?????? - * |----- ---|--- - ----|-- ------| - */ - M4OSA_UInt8 uiHh; - M4OSA_UInt8 uiMm; - M4OSA_UInt8 uiSs; - M4OSA_UInt8 uiTmp; - M4OSA_UInt32 uiCtsSec; - - /** - * Read ss */ - uiSs = (( pAuDataBuffer[2] & 0xC0) >> 6); - uiTmp = (( pAuDataBuffer[1] & 0x0F) << 2); - uiCtsSec = uiSs + uiTmp; - - /** - * Read mm */ - uiMm = (( pAuDataBuffer[1] & 0xE0) >> 5); - uiTmp = (( pAuDataBuffer[0] & 0x07) << 3); - uiMm = uiMm + uiTmp; - uiCtsSec = ( uiMm * 60) + uiCtsSec; - - /** - * Read hh */ - uiHh = (( pAuDataBuffer[0] & 0xF8) >> 3); - - if( uiHh ) - { - uiCtsSec = ( uiHh * 3600) + uiCtsSec; - } - - /* - * in sec */ - *pCtsSec = uiCtsSec; - - return; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_intAllocateYUV420() - * @brief Allocate the three YUV 4:2:0 planes - * @note - * @param pPlanes (IN/OUT) valid pointer to 3 M4VIFI_ImagePlane structures - * @param uiWidth (IN) Image width - * @param uiHeight(IN) Image height - ****************************************************************************** - */ -static M4OSA_ERR M4VSS3GPP_intAllocateYUV420( M4VIFI_ImagePlane *pPlanes, - M4OSA_UInt32 uiWidth, M4OSA_UInt32 uiHeight ) -{ - if (pPlanes == M4OSA_NULL) { - M4OSA_TRACE1_0("M4VSS3GPP_intAllocateYUV420: Invalid pPlanes pointer"); - return M4ERR_PARAMETER; - } - /* if the buffer is not NULL and same size with target size, - * do not malloc again*/ - if (pPlanes[0].pac_data != M4OSA_NULL && - pPlanes[0].u_width == uiWidth && - pPlanes[0].u_height == uiHeight) { - return M4NO_ERROR; - } - - pPlanes[0].u_width = uiWidth; - pPlanes[0].u_height = uiHeight; - pPlanes[0].u_stride = uiWidth; - pPlanes[0].u_topleft = 0; - - if (pPlanes[0].pac_data != M4OSA_NULL) { - free(pPlanes[0].pac_data); - pPlanes[0].pac_data = M4OSA_NULL; - } - pPlanes[0].pac_data = (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(pPlanes[0].u_stride - * pPlanes[0].u_height, M4VSS3GPP, (M4OSA_Char *)"pPlanes[0].pac_data"); - - if( M4OSA_NULL == pPlanes[0].pac_data ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAllocateYUV420: unable to allocate pPlanes[0].pac_data,\ - returning M4ERR_ALLOC"); - return M4ERR_ALLOC; - } - - pPlanes[1].u_width = pPlanes[0].u_width >> 1; - pPlanes[1].u_height = pPlanes[0].u_height >> 1; - pPlanes[1].u_stride = pPlanes[1].u_width; - pPlanes[1].u_topleft = 0; - if (pPlanes[1].pac_data != M4OSA_NULL) { - free(pPlanes[1].pac_data); - pPlanes[1].pac_data = M4OSA_NULL; - } - pPlanes[1].pac_data = (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(pPlanes[1].u_stride - * pPlanes[1].u_height, M4VSS3GPP,(M4OSA_Char *) "pPlanes[1].pac_data"); - - if( M4OSA_NULL == pPlanes[1].pac_data ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAllocateYUV420: unable to allocate pPlanes[1].pac_data,\ - returning M4ERR_ALLOC"); - free((void *)pPlanes[0].pac_data); - pPlanes[0].pac_data = M4OSA_NULL; - return M4ERR_ALLOC; - } - - pPlanes[2].u_width = pPlanes[1].u_width; - pPlanes[2].u_height = pPlanes[1].u_height; - pPlanes[2].u_stride = pPlanes[2].u_width; - pPlanes[2].u_topleft = 0; - if (pPlanes[2].pac_data != M4OSA_NULL) { - free(pPlanes[2].pac_data); - pPlanes[2].pac_data = M4OSA_NULL; - } - pPlanes[2].pac_data = (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc(pPlanes[2].u_stride - * pPlanes[2].u_height, M4VSS3GPP, (M4OSA_Char *)"pPlanes[2].pac_data"); - - if( M4OSA_NULL == pPlanes[2].pac_data ) - { - M4OSA_TRACE1_0( - "M4VSS3GPP_intAllocateYUV420: unable to allocate pPlanes[2].pac_data,\ - returning M4ERR_ALLOC"); - free((void *)pPlanes[0].pac_data); - free((void *)pPlanes[1].pac_data); - pPlanes[0].pac_data = M4OSA_NULL; - pPlanes[1].pac_data = M4OSA_NULL; - return M4ERR_ALLOC; - } - - memset((void *)pPlanes[0].pac_data, 0, pPlanes[0].u_stride*pPlanes[0].u_height); - memset((void *)pPlanes[1].pac_data, 0, pPlanes[1].u_stride*pPlanes[1].u_height); - memset((void *)pPlanes[2].pac_data, 0, pPlanes[2].u_stride*pPlanes[2].u_height); - /** - * Return */ - M4OSA_TRACE3_0("M4VSS3GPP_intAllocateYUV420: returning M4NO_ERROR"); - return M4NO_ERROR; -} - -/** -****************************************************************************** -* M4OSA_ERR M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420(M4OSA_Void* pFileIn, -* M4OSA_FileReadPointer* pFileReadPtr, -* M4VIFI_ImagePlane* pImagePlanes, -* M4OSA_UInt32 width, -* M4OSA_UInt32 height); -* @brief It Coverts and resizes a ARGB8888 image to YUV420 -* @note -* @param pFileIn (IN) The ARGB888 input file -* @param pFileReadPtr (IN) Pointer on filesystem functions -* @param pImagePlanes (IN/OUT) Pointer on YUV420 output planes allocated by the user. -* ARGB8888 image will be converted and resized to output -* YUV420 plane size -* @param width (IN) width of the ARGB8888 -* @param height (IN) height of the ARGB8888 -* @return M4NO_ERROR: No error -* @return M4ERR_ALLOC: memory error -* @return M4ERR_PARAMETER: At least one of the function parameters is null -****************************************************************************** -*/ - -M4OSA_ERR M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420(M4OSA_Void* pFileIn, - M4OSA_FileReadPointer* pFileReadPtr, - M4VIFI_ImagePlane* pImagePlanes, - M4OSA_UInt32 width,M4OSA_UInt32 height) { - M4OSA_Context pARGBIn; - M4VIFI_ImagePlane rgbPlane1 ,rgbPlane2; - M4OSA_UInt32 frameSize_argb = width * height * 4; - M4OSA_UInt32 frameSize_rgb888 = width * height * 3; - M4OSA_UInt32 i = 0,j= 0; - M4OSA_ERR err = M4NO_ERROR; - - M4OSA_UInt8 *pArgbPlane = - (M4OSA_UInt8*) M4OSA_32bitAlignedMalloc(frameSize_argb, - M4VS, (M4OSA_Char*)"argb data"); - if (pArgbPlane == M4OSA_NULL) { - M4OSA_TRACE1_0("M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420: \ - Failed to allocate memory for ARGB plane"); - return M4ERR_ALLOC; - } - - /* Get file size */ - err = pFileReadPtr->openRead(&pARGBIn, pFileIn, M4OSA_kFileRead); - if (err != M4NO_ERROR) { - M4OSA_TRACE1_2("M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420 : \ - Can not open input ARGB8888 file %s, error: 0x%x\n",pFileIn, err); - free(pArgbPlane); - pArgbPlane = M4OSA_NULL; - goto cleanup; - } - - err = pFileReadPtr->readData(pARGBIn,(M4OSA_MemAddr8)pArgbPlane, - &frameSize_argb); - if (err != M4NO_ERROR) { - M4OSA_TRACE1_2("M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420 \ - Can not read ARGB8888 file %s, error: 0x%x\n",pFileIn, err); - pFileReadPtr->closeRead(pARGBIn); - free(pArgbPlane); - pArgbPlane = M4OSA_NULL; - goto cleanup; - } - - err = pFileReadPtr->closeRead(pARGBIn); - if(err != M4NO_ERROR) { - M4OSA_TRACE1_2("M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420 \ - Can not close ARGB8888 file %s, error: 0x%x\n",pFileIn, err); - free(pArgbPlane); - pArgbPlane = M4OSA_NULL; - goto cleanup; - } - - rgbPlane1.pac_data = - (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(frameSize_rgb888, - M4VS, (M4OSA_Char*)"RGB888 plane1"); - if(rgbPlane1.pac_data == M4OSA_NULL) { - M4OSA_TRACE1_0("M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420 \ - Failed to allocate memory for rgb plane1"); - free(pArgbPlane); - return M4ERR_ALLOC; - } - - rgbPlane1.u_height = height; - rgbPlane1.u_width = width; - rgbPlane1.u_stride = width*3; - rgbPlane1.u_topleft = 0; - - - /** Remove the alpha channel */ - for (i=0, j = 0; i < frameSize_argb; i++) { - if ((i % 4) == 0) continue; - rgbPlane1.pac_data[j] = pArgbPlane[i]; - j++; - } - free(pArgbPlane); - - /** - * Check if resizing is required with color conversion */ - if(width != pImagePlanes->u_width || height != pImagePlanes->u_height) { - - frameSize_rgb888 = pImagePlanes->u_width * pImagePlanes->u_height * 3; - rgbPlane2.pac_data = - (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(frameSize_rgb888, M4VS, - (M4OSA_Char*)"rgb Plane2"); - if(rgbPlane2.pac_data == M4OSA_NULL) { - M4OSA_TRACE1_0("Failed to allocate memory for rgb plane2"); - free(rgbPlane1.pac_data); - return M4ERR_ALLOC; - } - rgbPlane2.u_height = pImagePlanes->u_height; - rgbPlane2.u_width = pImagePlanes->u_width; - rgbPlane2.u_stride = pImagePlanes->u_width*3; - rgbPlane2.u_topleft = 0; - - /* Resizing */ - err = M4VIFI_ResizeBilinearRGB888toRGB888(M4OSA_NULL, - &rgbPlane1, &rgbPlane2); - free(rgbPlane1.pac_data); - if(err != M4NO_ERROR) { - M4OSA_TRACE1_1("error resizing RGB888 to RGB888: 0x%x\n", err); - free(rgbPlane2.pac_data); - return err; - } - - /*Converting Resized RGB888 to YUV420 */ - err = M4VIFI_RGB888toYUV420(M4OSA_NULL, &rgbPlane2, pImagePlanes); - free(rgbPlane2.pac_data); - if(err != M4NO_ERROR) { - M4OSA_TRACE1_1("error converting from RGB888 to YUV: 0x%x\n", err); - return err; - } - } else { - err = M4VIFI_RGB888toYUV420(M4OSA_NULL, &rgbPlane1, pImagePlanes); - if(err != M4NO_ERROR) { - M4OSA_TRACE1_1("error when converting from RGB to YUV: 0x%x\n", err); - } - free(rgbPlane1.pac_data); - } -cleanup: - M4OSA_TRACE3_0("M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420 exit"); - return err; -} - -M4OSA_ERR M4VSS3GPP_intApplyRenderingMode(M4VSS3GPP_InternalEditContext *pC, - M4xVSS_MediaRendering renderingMode, - M4VIFI_ImagePlane* pInplane, - M4VIFI_ImagePlane* pOutplane) { - - M4OSA_ERR err = M4NO_ERROR; - M4AIR_Params airParams; - M4VIFI_ImagePlane pImagePlanesTemp[3]; - M4OSA_UInt32 i = 0; - - if (renderingMode == M4xVSS_kBlackBorders) { - memset((void *)pOutplane[0].pac_data, Y_PLANE_BORDER_VALUE, - (pOutplane[0].u_height*pOutplane[0].u_stride)); - memset((void *)pOutplane[1].pac_data, U_PLANE_BORDER_VALUE, - (pOutplane[1].u_height*pOutplane[1].u_stride)); - memset((void *)pOutplane[2].pac_data, V_PLANE_BORDER_VALUE, - (pOutplane[2].u_height*pOutplane[2].u_stride)); - } - - if (renderingMode == M4xVSS_kResizing) { - /** - * Call the resize filter. - * From the intermediate frame to the encoder image plane */ - err = M4VIFI_ResizeBilinearYUV420toYUV420(M4OSA_NULL, - pInplane, pOutplane); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intApplyRenderingMode: \ - M4ViFilResizeBilinearYUV420toYUV420 returns 0x%x!", err); - return err; - } - } else { - M4VIFI_ImagePlane* pPlaneTemp = M4OSA_NULL; - M4OSA_UInt8* pOutPlaneY = - pOutplane[0].pac_data + pOutplane[0].u_topleft; - M4OSA_UInt8* pOutPlaneU = - pOutplane[1].pac_data + pOutplane[1].u_topleft; - M4OSA_UInt8* pOutPlaneV = - pOutplane[2].pac_data + pOutplane[2].u_topleft; - M4OSA_UInt8* pInPlaneY = M4OSA_NULL; - M4OSA_UInt8* pInPlaneU = M4OSA_NULL; - M4OSA_UInt8* pInPlaneV = M4OSA_NULL; - - /* To keep media aspect ratio*/ - /* Initialize AIR Params*/ - airParams.m_inputCoord.m_x = 0; - airParams.m_inputCoord.m_y = 0; - airParams.m_inputSize.m_height = pInplane->u_height; - airParams.m_inputSize.m_width = pInplane->u_width; - airParams.m_outputSize.m_width = pOutplane->u_width; - airParams.m_outputSize.m_height = pOutplane->u_height; - airParams.m_bOutputStripe = M4OSA_FALSE; - airParams.m_outputOrientation = M4COMMON_kOrientationTopLeft; - - /** - Media rendering: Black borders*/ - if (renderingMode == M4xVSS_kBlackBorders) { - pImagePlanesTemp[0].u_width = pOutplane[0].u_width; - pImagePlanesTemp[0].u_height = pOutplane[0].u_height; - pImagePlanesTemp[0].u_stride = pOutplane[0].u_width; - pImagePlanesTemp[0].u_topleft = 0; - - pImagePlanesTemp[1].u_width = pOutplane[1].u_width; - pImagePlanesTemp[1].u_height = pOutplane[1].u_height; - pImagePlanesTemp[1].u_stride = pOutplane[1].u_width; - pImagePlanesTemp[1].u_topleft = 0; - - pImagePlanesTemp[2].u_width = pOutplane[2].u_width; - pImagePlanesTemp[2].u_height = pOutplane[2].u_height; - pImagePlanesTemp[2].u_stride = pOutplane[2].u_width; - pImagePlanesTemp[2].u_topleft = 0; - - /** - * Allocates plan in local image plane structure */ - pImagePlanesTemp[0].pac_data = - (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc( - pImagePlanesTemp[0].u_width * pImagePlanesTemp[0].u_height, - M4VS, (M4OSA_Char *)"pImagePlaneTemp Y") ; - if (pImagePlanesTemp[0].pac_data == M4OSA_NULL) { - M4OSA_TRACE1_0("M4VSS3GPP_intApplyRenderingMode: Alloc Error"); - return M4ERR_ALLOC; - } - pImagePlanesTemp[1].pac_data = - (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc( - pImagePlanesTemp[1].u_width * pImagePlanesTemp[1].u_height, - M4VS, (M4OSA_Char *)"pImagePlaneTemp U") ; - if (pImagePlanesTemp[1].pac_data == M4OSA_NULL) { - M4OSA_TRACE1_0("M4VSS3GPP_intApplyRenderingMode: Alloc Error"); - free(pImagePlanesTemp[0].pac_data); - return M4ERR_ALLOC; - } - pImagePlanesTemp[2].pac_data = - (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc( - pImagePlanesTemp[2].u_width * pImagePlanesTemp[2].u_height, - M4VS, (M4OSA_Char *)"pImagePlaneTemp V") ; - if (pImagePlanesTemp[2].pac_data == M4OSA_NULL) { - M4OSA_TRACE1_0("M4VSS3GPP_intApplyRenderingMode: Alloc Error"); - free(pImagePlanesTemp[0].pac_data); - free(pImagePlanesTemp[1].pac_data); - return M4ERR_ALLOC; - } - - pInPlaneY = pImagePlanesTemp[0].pac_data ; - pInPlaneU = pImagePlanesTemp[1].pac_data ; - pInPlaneV = pImagePlanesTemp[2].pac_data ; - - memset((void *)pImagePlanesTemp[0].pac_data, Y_PLANE_BORDER_VALUE, - (pImagePlanesTemp[0].u_height*pImagePlanesTemp[0].u_stride)); - memset((void *)pImagePlanesTemp[1].pac_data, U_PLANE_BORDER_VALUE, - (pImagePlanesTemp[1].u_height*pImagePlanesTemp[1].u_stride)); - memset((void *)pImagePlanesTemp[2].pac_data, V_PLANE_BORDER_VALUE, - (pImagePlanesTemp[2].u_height*pImagePlanesTemp[2].u_stride)); - - M4OSA_UInt32 height = - (pInplane->u_height * pOutplane->u_width) /pInplane->u_width; - - if (height <= pOutplane->u_height) { - /** - * Black borders will be on the top and the bottom side */ - airParams.m_outputSize.m_width = pOutplane->u_width; - airParams.m_outputSize.m_height = height; - /** - * Number of lines at the top */ - pImagePlanesTemp[0].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[0].u_height - - airParams.m_outputSize.m_height)>>1)) * - pImagePlanesTemp[0].u_stride; - pImagePlanesTemp[0].u_height = airParams.m_outputSize.m_height; - pImagePlanesTemp[1].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[1].u_height - - (airParams.m_outputSize.m_height>>1)))>>1) * - pImagePlanesTemp[1].u_stride; - pImagePlanesTemp[1].u_height = - airParams.m_outputSize.m_height>>1; - pImagePlanesTemp[2].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[2].u_height - - (airParams.m_outputSize.m_height>>1)))>>1) * - pImagePlanesTemp[2].u_stride; - pImagePlanesTemp[2].u_height = - airParams.m_outputSize.m_height>>1; - } else { - /** - * Black borders will be on the left and right side */ - airParams.m_outputSize.m_height = pOutplane->u_height; - airParams.m_outputSize.m_width = - (M4OSA_UInt32)((pInplane->u_width * pOutplane->u_height)/pInplane->u_height); - - pImagePlanesTemp[0].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[0].u_width - - airParams.m_outputSize.m_width)>>1)); - pImagePlanesTemp[0].u_width = airParams.m_outputSize.m_width; - pImagePlanesTemp[1].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[1].u_width - - (airParams.m_outputSize.m_width>>1)))>>1); - pImagePlanesTemp[1].u_width = airParams.m_outputSize.m_width>>1; - pImagePlanesTemp[2].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[2].u_width - - (airParams.m_outputSize.m_width>>1)))>>1); - pImagePlanesTemp[2].u_width = airParams.m_outputSize.m_width>>1; - } - - /** - * Width and height have to be even */ - airParams.m_outputSize.m_width = - (airParams.m_outputSize.m_width>>1)<<1; - airParams.m_outputSize.m_height = - (airParams.m_outputSize.m_height>>1)<<1; - airParams.m_inputSize.m_width = - (airParams.m_inputSize.m_width>>1)<<1; - airParams.m_inputSize.m_height = - (airParams.m_inputSize.m_height>>1)<<1; - pImagePlanesTemp[0].u_width = - (pImagePlanesTemp[0].u_width>>1)<<1; - pImagePlanesTemp[1].u_width = - (pImagePlanesTemp[1].u_width>>1)<<1; - pImagePlanesTemp[2].u_width = - (pImagePlanesTemp[2].u_width>>1)<<1; - pImagePlanesTemp[0].u_height = - (pImagePlanesTemp[0].u_height>>1)<<1; - pImagePlanesTemp[1].u_height = - (pImagePlanesTemp[1].u_height>>1)<<1; - pImagePlanesTemp[2].u_height = - (pImagePlanesTemp[2].u_height>>1)<<1; - - /** - * Check that values are coherent */ - if (airParams.m_inputSize.m_height == - airParams.m_outputSize.m_height) { - airParams.m_inputSize.m_width = - airParams.m_outputSize.m_width; - } else if (airParams.m_inputSize.m_width == - airParams.m_outputSize.m_width) { - airParams.m_inputSize.m_height = - airParams.m_outputSize.m_height; - } - pPlaneTemp = pImagePlanesTemp; - } - - /** - * Media rendering: Cropping*/ - if (renderingMode == M4xVSS_kCropping) { - airParams.m_outputSize.m_height = pOutplane->u_height; - airParams.m_outputSize.m_width = pOutplane->u_width; - if ((airParams.m_outputSize.m_height * - airParams.m_inputSize.m_width)/airParams.m_outputSize.m_width < - airParams.m_inputSize.m_height) { - /* Height will be cropped */ - airParams.m_inputSize.m_height = - (M4OSA_UInt32)((airParams.m_outputSize.m_height * - airParams.m_inputSize.m_width)/airParams.m_outputSize.m_width); - airParams.m_inputSize.m_height = - (airParams.m_inputSize.m_height>>1)<<1; - airParams.m_inputCoord.m_y = - (M4OSA_Int32)((M4OSA_Int32)((pInplane->u_height - - airParams.m_inputSize.m_height))>>1); - } else { - /* Width will be cropped */ - airParams.m_inputSize.m_width = - (M4OSA_UInt32)((airParams.m_outputSize.m_width * - airParams.m_inputSize.m_height)/airParams.m_outputSize.m_height); - airParams.m_inputSize.m_width = - (airParams.m_inputSize.m_width>>1)<<1; - airParams.m_inputCoord.m_x = - (M4OSA_Int32)((M4OSA_Int32)((pInplane->u_width - - airParams.m_inputSize.m_width))>>1); - } - pPlaneTemp = pOutplane; - } - /** - * Call AIR functions */ - if (M4OSA_NULL == pC->m_air_context) { - err = M4AIR_create(&pC->m_air_context, M4AIR_kYUV420P); - if(err != M4NO_ERROR) { - M4OSA_TRACE1_1("M4VSS3GPP_intApplyRenderingMode: \ - M4AIR_create returned error 0x%x", err); - goto cleanUp; - } - } - - err = M4AIR_configure(pC->m_air_context, &airParams); - if (err != M4NO_ERROR) { - M4OSA_TRACE1_1("M4VSS3GPP_intApplyRenderingMode: \ - Error when configuring AIR: 0x%x", err); - M4AIR_cleanUp(pC->m_air_context); - goto cleanUp; - } - - err = M4AIR_get(pC->m_air_context, pInplane, pPlaneTemp); - if (err != M4NO_ERROR) { - M4OSA_TRACE1_1("M4VSS3GPP_intApplyRenderingMode: \ - Error when getting AIR plane: 0x%x", err); - M4AIR_cleanUp(pC->m_air_context); - goto cleanUp; - } - - if (renderingMode == M4xVSS_kBlackBorders) { - for (i=0; i<pOutplane[0].u_height; i++) { - memcpy((void *)pOutPlaneY, (void *)pInPlaneY, - pOutplane[0].u_width); - pInPlaneY += pOutplane[0].u_width; - pOutPlaneY += pOutplane[0].u_stride; - } - for (i=0; i<pOutplane[1].u_height; i++) { - memcpy((void *)pOutPlaneU, (void *)pInPlaneU, - pOutplane[1].u_width); - pInPlaneU += pOutplane[1].u_width; - pOutPlaneU += pOutplane[1].u_stride; - } - for (i=0; i<pOutplane[2].u_height; i++) { - memcpy((void *)pOutPlaneV, (void *)pInPlaneV, - pOutplane[2].u_width); - pInPlaneV += pOutplane[2].u_width; - pOutPlaneV += pOutplane[2].u_stride; - } - } - } -cleanUp: - if (renderingMode == M4xVSS_kBlackBorders) { - for (i=0; i<3; i++) { - if (pImagePlanesTemp[i].pac_data != M4OSA_NULL) { - free(pImagePlanesTemp[i].pac_data); - pImagePlanesTemp[i].pac_data = M4OSA_NULL; - } - } - } - return err; -} - -M4OSA_ERR M4VSS3GPP_intSetYuv420PlaneFromARGB888 ( - M4VSS3GPP_InternalEditContext *pC, - M4VSS3GPP_ClipContext* pClipCtxt) { - - M4OSA_ERR err= M4NO_ERROR; - - // Allocate memory for YUV plane - pClipCtxt->pPlaneYuv = - (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc( - 3*sizeof(M4VIFI_ImagePlane), M4VS, - (M4OSA_Char*)"pPlaneYuv"); - - if (pClipCtxt->pPlaneYuv == M4OSA_NULL) { - return M4ERR_ALLOC; - } - - pClipCtxt->pPlaneYuv[0].u_height = - pClipCtxt->pSettings->ClipProperties.uiStillPicHeight; - pClipCtxt->pPlaneYuv[0].u_width = - pClipCtxt->pSettings->ClipProperties.uiStillPicWidth; - pClipCtxt->pPlaneYuv[0].u_stride = pClipCtxt->pPlaneYuv[0].u_width; - pClipCtxt->pPlaneYuv[0].u_topleft = 0; - - pClipCtxt->pPlaneYuv[0].pac_data = - (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc( - pClipCtxt->pPlaneYuv[0].u_height * pClipCtxt->pPlaneYuv[0].u_width * 1.5, - M4VS, (M4OSA_Char*)"imageClip YUV data"); - if (pClipCtxt->pPlaneYuv[0].pac_data == M4OSA_NULL) { - free(pClipCtxt->pPlaneYuv); - return M4ERR_ALLOC; - } - - pClipCtxt->pPlaneYuv[1].u_height = pClipCtxt->pPlaneYuv[0].u_height >>1; - pClipCtxt->pPlaneYuv[1].u_width = pClipCtxt->pPlaneYuv[0].u_width >> 1; - pClipCtxt->pPlaneYuv[1].u_stride = pClipCtxt->pPlaneYuv[1].u_width; - pClipCtxt->pPlaneYuv[1].u_topleft = 0; - pClipCtxt->pPlaneYuv[1].pac_data = (M4VIFI_UInt8*)( - pClipCtxt->pPlaneYuv[0].pac_data + - pClipCtxt->pPlaneYuv[0].u_height * pClipCtxt->pPlaneYuv[0].u_width); - - pClipCtxt->pPlaneYuv[2].u_height = pClipCtxt->pPlaneYuv[0].u_height >>1; - pClipCtxt->pPlaneYuv[2].u_width = pClipCtxt->pPlaneYuv[0].u_width >> 1; - pClipCtxt->pPlaneYuv[2].u_stride = pClipCtxt->pPlaneYuv[2].u_width; - pClipCtxt->pPlaneYuv[2].u_topleft = 0; - pClipCtxt->pPlaneYuv[2].pac_data = (M4VIFI_UInt8*)( - pClipCtxt->pPlaneYuv[1].pac_data + - pClipCtxt->pPlaneYuv[1].u_height * pClipCtxt->pPlaneYuv[1].u_width); - - err = M4VSS3GPP_internalConvertAndResizeARGB8888toYUV420 ( - pClipCtxt->pSettings->pFile, - pC->pOsaFileReadPtr, - pClipCtxt->pPlaneYuv, - pClipCtxt->pSettings->ClipProperties.uiStillPicWidth, - pClipCtxt->pSettings->ClipProperties.uiStillPicHeight); - if (M4NO_ERROR != err) { - free(pClipCtxt->pPlaneYuv[0].pac_data); - free(pClipCtxt->pPlaneYuv); - return err; - } - - // Set the YUV data to the decoder using setoption - err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption ( - pClipCtxt->pViDecCtxt, - M4DECODER_kOptionID_DecYuvData, - (M4OSA_DataOption)pClipCtxt->pPlaneYuv); - if (M4NO_ERROR != err) { - free(pClipCtxt->pPlaneYuv[0].pac_data); - free(pClipCtxt->pPlaneYuv); - return err; - } - - pClipCtxt->pSettings->ClipProperties.bSetImageData = M4OSA_TRUE; - - // Allocate Yuv plane with effect - pClipCtxt->pPlaneYuvWithEffect = - (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc( - 3*sizeof(M4VIFI_ImagePlane), M4VS, - (M4OSA_Char*)"pPlaneYuvWithEffect"); - if (pClipCtxt->pPlaneYuvWithEffect == M4OSA_NULL) { - free(pClipCtxt->pPlaneYuv[0].pac_data); - free(pClipCtxt->pPlaneYuv); - return M4ERR_ALLOC; - } - - pClipCtxt->pPlaneYuvWithEffect[0].u_height = pC->ewc.uiVideoHeight; - pClipCtxt->pPlaneYuvWithEffect[0].u_width = pC->ewc.uiVideoWidth; - pClipCtxt->pPlaneYuvWithEffect[0].u_stride = pC->ewc.uiVideoWidth; - pClipCtxt->pPlaneYuvWithEffect[0].u_topleft = 0; - - pClipCtxt->pPlaneYuvWithEffect[0].pac_data = - (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc( - pC->ewc.uiVideoHeight * pC->ewc.uiVideoWidth * 1.5, - M4VS, (M4OSA_Char*)"imageClip YUV data"); - if (pClipCtxt->pPlaneYuvWithEffect[0].pac_data == M4OSA_NULL) { - free(pClipCtxt->pPlaneYuv[0].pac_data); - free(pClipCtxt->pPlaneYuv); - free(pClipCtxt->pPlaneYuvWithEffect); - return M4ERR_ALLOC; - } - - pClipCtxt->pPlaneYuvWithEffect[1].u_height = - pClipCtxt->pPlaneYuvWithEffect[0].u_height >>1; - pClipCtxt->pPlaneYuvWithEffect[1].u_width = - pClipCtxt->pPlaneYuvWithEffect[0].u_width >> 1; - pClipCtxt->pPlaneYuvWithEffect[1].u_stride = - pClipCtxt->pPlaneYuvWithEffect[1].u_width; - pClipCtxt->pPlaneYuvWithEffect[1].u_topleft = 0; - pClipCtxt->pPlaneYuvWithEffect[1].pac_data = (M4VIFI_UInt8*)( - pClipCtxt->pPlaneYuvWithEffect[0].pac_data + - pClipCtxt->pPlaneYuvWithEffect[0].u_height * pClipCtxt->pPlaneYuvWithEffect[0].u_width); - - pClipCtxt->pPlaneYuvWithEffect[2].u_height = - pClipCtxt->pPlaneYuvWithEffect[0].u_height >>1; - pClipCtxt->pPlaneYuvWithEffect[2].u_width = - pClipCtxt->pPlaneYuvWithEffect[0].u_width >> 1; - pClipCtxt->pPlaneYuvWithEffect[2].u_stride = - pClipCtxt->pPlaneYuvWithEffect[2].u_width; - pClipCtxt->pPlaneYuvWithEffect[2].u_topleft = 0; - pClipCtxt->pPlaneYuvWithEffect[2].pac_data = (M4VIFI_UInt8*)( - pClipCtxt->pPlaneYuvWithEffect[1].pac_data + - pClipCtxt->pPlaneYuvWithEffect[1].u_height * pClipCtxt->pPlaneYuvWithEffect[1].u_width); - - err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption( - pClipCtxt->pViDecCtxt, M4DECODER_kOptionID_YuvWithEffectContiguous, - (M4OSA_DataOption)pClipCtxt->pPlaneYuvWithEffect); - if (M4NO_ERROR != err) { - free(pClipCtxt->pPlaneYuv[0].pac_data); - free(pClipCtxt->pPlaneYuv); - free(pClipCtxt->pPlaneYuvWithEffect); - return err; - } - - return M4NO_ERROR; -} - -M4OSA_ERR M4VSS3GPP_intRenderFrameWithEffect(M4VSS3GPP_InternalEditContext *pC, - M4VSS3GPP_ClipContext* pClipCtxt, - M4_MediaTime ts, - M4OSA_Bool bIsClip1, - M4VIFI_ImagePlane *pResizePlane, - M4VIFI_ImagePlane *pPlaneNoResize, - M4VIFI_ImagePlane *pPlaneOut) { - - M4OSA_ERR err = M4NO_ERROR; - M4OSA_UInt8 numEffects = 0; - M4VIFI_ImagePlane *pDecoderRenderFrame = M4OSA_NULL; - M4OSA_UInt32 yuvFrameWidth = 0, yuvFrameHeight = 0; - M4VIFI_ImagePlane* pTmp = M4OSA_NULL; - M4VIFI_ImagePlane pTemp[3]; - M4OSA_UInt8 i = 0; - M4OSA_Bool bSkipFramingEffect = M4OSA_FALSE; - - memset((void *)pTemp, 0, 3*sizeof(M4VIFI_ImagePlane)); - /* Resize or rotate case */ - if (M4OSA_NULL != pClipCtxt->m_pPreResizeFrame) { - /** - * If we do modify the image, we need an intermediate image plane */ - err = M4VSS3GPP_intAllocateYUV420(pResizePlane, - pClipCtxt->m_pPreResizeFrame[0].u_width, - pClipCtxt->m_pPreResizeFrame[0].u_height); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ - M4VSS3GPP_intAllocateYUV420 returns 0x%x", err); - return err; - } - - if ((pClipCtxt->pSettings->FileType == - M4VIDEOEDITING_kFileType_ARGB8888) && - (pC->nbActiveEffects == 0) && - (pClipCtxt->bGetYuvDataFromDecoder == M4OSA_FALSE)) { - - err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption( - pClipCtxt->pViDecCtxt, - M4DECODER_kOptionID_EnableYuvWithEffect, - (M4OSA_DataOption)M4OSA_TRUE); - if (M4NO_ERROR == err) { - pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctRender( - pClipCtxt->pViDecCtxt, &ts, - pClipCtxt->pPlaneYuvWithEffect, M4OSA_TRUE); - } - - } else { - if (pClipCtxt->pSettings->FileType == - M4VIDEOEDITING_kFileType_ARGB8888) { - err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption( - pClipCtxt->pViDecCtxt, - M4DECODER_kOptionID_EnableYuvWithEffect, - (M4OSA_DataOption)M4OSA_FALSE); - } - if (M4NO_ERROR == err) { - err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctRender( - pClipCtxt->pViDecCtxt, &ts, - pClipCtxt->m_pPreResizeFrame, M4OSA_TRUE); - } - - } - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ - returns error 0x%x", err); - return err; - } - - if (pClipCtxt->pSettings->FileType != - M4VIDEOEDITING_kFileType_ARGB8888) { - if (0 != pClipCtxt->pSettings->ClipProperties.videoRotationDegrees) { - // Save width and height of un-rotated frame - yuvFrameWidth = pClipCtxt->m_pPreResizeFrame[0].u_width; - yuvFrameHeight = pClipCtxt->m_pPreResizeFrame[0].u_height; - err = M4VSS3GPP_intRotateVideo(pClipCtxt->m_pPreResizeFrame, - pClipCtxt->pSettings->ClipProperties.videoRotationDegrees); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ - rotateVideo() returns error 0x%x", err); - return err; - } - /* Set the new video size for temporary buffer */ - M4VSS3GPP_intSetYUV420Plane(pResizePlane, - pClipCtxt->m_pPreResizeFrame[0].u_width, - pClipCtxt->m_pPreResizeFrame[0].u_height); - } - } - - if (bIsClip1 == M4OSA_TRUE) { - pC->bIssecondClip = M4OSA_FALSE; - numEffects = pC->nbActiveEffects; - } else { - numEffects = pC->nbActiveEffects1; - pC->bIssecondClip = M4OSA_TRUE; - } - - if ( numEffects > 0) { - pClipCtxt->bGetYuvDataFromDecoder = M4OSA_TRUE; - /* If video frame need to be resized or rotated, - * then apply the overlay after the frame was rendered with rendering mode. - * Here skip the framing(overlay) effect when applying video Effect. */ - bSkipFramingEffect = M4OSA_TRUE; - err = M4VSS3GPP_intApplyVideoEffect(pC, - pClipCtxt->m_pPreResizeFrame, pResizePlane, bSkipFramingEffect); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ - M4VSS3GPP_intApplyVideoEffect() err 0x%x", err); - return err; - } - pDecoderRenderFrame= pResizePlane; - } else { - pDecoderRenderFrame = pClipCtxt->m_pPreResizeFrame; - } - /* Do rendering mode */ - if ((pClipCtxt->bGetYuvDataFromDecoder == M4OSA_TRUE) || - (pClipCtxt->pSettings->FileType != - M4VIDEOEDITING_kFileType_ARGB8888)) { - if (bIsClip1 == M4OSA_TRUE) { - if (pC->bClip1ActiveFramingEffect == M4OSA_TRUE) { - err = M4VSS3GPP_intAllocateYUV420(pTemp, - pPlaneOut[0].u_width, pPlaneOut[0].u_height); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ - M4VSS3GPP_intAllocateYUV420 error 0x%x", err); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - pTmp = pTemp; - } else { - pTmp = pC->yuv1; - } - err = M4VSS3GPP_intApplyRenderingMode (pC, - pClipCtxt->pSettings->xVSS.MediaRendering, - pDecoderRenderFrame,pTmp); - } else { - if (pC->bClip2ActiveFramingEffect == M4OSA_TRUE) { - err = M4VSS3GPP_intAllocateYUV420(pTemp, - pPlaneOut[0].u_width, pPlaneOut[0].u_height); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ - M4VSS3GPP_intAllocateYUV420 error 0x%x", err); - pC->ewc.VppError = err; - return M4NO_ERROR; - } - pTmp = pTemp; - } else { - pTmp = pC->yuv2; - } - err = M4VSS3GPP_intApplyRenderingMode (pC, - pClipCtxt->pSettings->xVSS.MediaRendering, - pDecoderRenderFrame,pTmp); - } - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ - M4VSS3GPP_intApplyRenderingMode error 0x%x ", err); - for (i=0; i<3; i++) { - if (pTemp[i].pac_data != M4OSA_NULL) { - free(pTemp[i].pac_data); - pTemp[i].pac_data = M4OSA_NULL; - } - } - return err; - } - /* Apply overlay if overlay exist*/ - if (bIsClip1 == M4OSA_TRUE) { - if (pC->bClip1ActiveFramingEffect == M4OSA_TRUE) { - err = M4VSS3GPP_intApplyVideoOverlay(pC, - pTemp, pC->yuv1); - } - pClipCtxt->lastDecodedPlane = pC->yuv1; - } else { - if (pC->bClip2ActiveFramingEffect == M4OSA_TRUE) { - err = M4VSS3GPP_intApplyVideoOverlay(pC, - pTemp, pC->yuv2); - } - pClipCtxt->lastDecodedPlane = pC->yuv2; - } - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intVPP: \ - M4VSS3GPP_intApplyVideoOverlay) error 0x%x ", err); - pC->ewc.VppError = err; - for (i=0; i<3; i++) { - if (pTemp[i].pac_data != M4OSA_NULL) { - free(pTemp[i].pac_data); - pTemp[i].pac_data = M4OSA_NULL; - } - } - return M4NO_ERROR; - } - } else { - pClipCtxt->lastDecodedPlane = pClipCtxt->pPlaneYuvWithEffect; - } - // free the temp buffer - for (i=0; i<3; i++) { - if (pTemp[i].pac_data != M4OSA_NULL) { - free(pTemp[i].pac_data); - pTemp[i].pac_data = M4OSA_NULL; - } - } - - if ((pClipCtxt->pSettings->FileType == - M4VIDEOEDITING_kFileType_ARGB8888) && - (pC->nbActiveEffects == 0) && - (pClipCtxt->bGetYuvDataFromDecoder == M4OSA_TRUE)) { - if (bIsClip1 == M4OSA_TRUE) { - err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption( - pClipCtxt->pViDecCtxt, - M4DECODER_kOptionID_YuvWithEffectNonContiguous, - (M4OSA_DataOption)pC->yuv1); - } else { - err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctSetOption( - pClipCtxt->pViDecCtxt, - M4DECODER_kOptionID_YuvWithEffectNonContiguous, - (M4OSA_DataOption)pC->yuv2); - } - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ - null decoder setOption error 0x%x ", err); - return err; - } - pClipCtxt->bGetYuvDataFromDecoder = M4OSA_FALSE; - } - - // Reset original width and height for resize frame plane - if (0 != pClipCtxt->pSettings->ClipProperties.videoRotationDegrees && - 180 != pClipCtxt->pSettings->ClipProperties.videoRotationDegrees) { - - M4VSS3GPP_intSetYUV420Plane(pClipCtxt->m_pPreResizeFrame, - yuvFrameWidth, yuvFrameHeight); - } - - } else { - /* No rotate or no resize case*/ - if (bIsClip1 == M4OSA_TRUE) { - numEffects = pC->nbActiveEffects; - } else { - numEffects = pC->nbActiveEffects1; - } - - if(numEffects > 0) { - err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctRender( - pClipCtxt->pViDecCtxt, &ts, pPlaneNoResize, M4OSA_TRUE); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ - Render returns error 0x%x", err); - return err; - } - - bSkipFramingEffect = M4OSA_FALSE; - if (bIsClip1 == M4OSA_TRUE) { - pC->bIssecondClip = M4OSA_FALSE; - err = M4VSS3GPP_intApplyVideoEffect(pC, pPlaneNoResize, - pC->yuv1, bSkipFramingEffect); - pClipCtxt->lastDecodedPlane = pC->yuv1; - } else { - pC->bIssecondClip = M4OSA_TRUE; - err = M4VSS3GPP_intApplyVideoEffect(pC, pPlaneNoResize, - pC->yuv2, bSkipFramingEffect); - pClipCtxt->lastDecodedPlane = pC->yuv2; - } - - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ - M4VSS3GPP_intApplyVideoEffect error 0x%x", err); - return err; - } - } else { - - if (bIsClip1 == M4OSA_TRUE) { - pTmp = pC->yuv1; - } else { - pTmp = pC->yuv2; - } - err = pClipCtxt->ShellAPI.m_pVideoDecoder->m_pFctRender( - pClipCtxt->pViDecCtxt, &ts, pTmp, M4OSA_TRUE); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_1("M4VSS3GPP_intRenderFrameWithEffect: \ - Render returns error 0x%x,", err); - return err; - } - pClipCtxt->lastDecodedPlane = pTmp; - } - pClipCtxt->iVideoRenderCts = (M4OSA_Int32)ts; - } - - return err; -} - -M4OSA_ERR M4VSS3GPP_intRotateVideo(M4VIFI_ImagePlane* pPlaneIn, - M4OSA_UInt32 rotationDegree) { - - M4OSA_ERR err = M4NO_ERROR; - M4VIFI_ImagePlane outPlane[3]; - - if (rotationDegree != 180) { - // Swap width and height of in plane - outPlane[0].u_width = pPlaneIn[0].u_height; - outPlane[0].u_height = pPlaneIn[0].u_width; - outPlane[0].u_stride = outPlane[0].u_width; - outPlane[0].u_topleft = 0; - outPlane[0].pac_data = (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc( - (outPlane[0].u_stride*outPlane[0].u_height), M4VS, - (M4OSA_Char*)("out Y plane for rotation")); - if (outPlane[0].pac_data == M4OSA_NULL) { - return M4ERR_ALLOC; - } - - outPlane[1].u_width = pPlaneIn[0].u_height/2; - outPlane[1].u_height = pPlaneIn[0].u_width/2; - outPlane[1].u_stride = outPlane[1].u_width; - outPlane[1].u_topleft = 0; - outPlane[1].pac_data = (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc( - (outPlane[1].u_stride*outPlane[1].u_height), M4VS, - (M4OSA_Char*)("out U plane for rotation")); - if (outPlane[1].pac_data == M4OSA_NULL) { - free((void *)outPlane[0].pac_data); - return M4ERR_ALLOC; - } - - outPlane[2].u_width = pPlaneIn[0].u_height/2; - outPlane[2].u_height = pPlaneIn[0].u_width/2; - outPlane[2].u_stride = outPlane[2].u_width; - outPlane[2].u_topleft = 0; - outPlane[2].pac_data = (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc( - (outPlane[2].u_stride*outPlane[2].u_height), M4VS, - (M4OSA_Char*)("out V plane for rotation")); - if (outPlane[2].pac_data == M4OSA_NULL) { - free((void *)outPlane[0].pac_data); - free((void *)outPlane[1].pac_data); - return M4ERR_ALLOC; - } - } - - switch(rotationDegree) { - case 90: - M4VIFI_Rotate90RightYUV420toYUV420(M4OSA_NULL, pPlaneIn, outPlane); - break; - - case 180: - // In plane rotation, so planeOut = planeIn - M4VIFI_Rotate180YUV420toYUV420(M4OSA_NULL, pPlaneIn, pPlaneIn); - break; - - case 270: - M4VIFI_Rotate90LeftYUV420toYUV420(M4OSA_NULL, pPlaneIn, outPlane); - break; - - default: - M4OSA_TRACE1_1("invalid rotation param %d", (int)rotationDegree); - err = M4ERR_PARAMETER; - break; - } - - if (rotationDegree != 180) { - memset((void *)pPlaneIn[0].pac_data, 0, - (pPlaneIn[0].u_width*pPlaneIn[0].u_height)); - memset((void *)pPlaneIn[1].pac_data, 0, - (pPlaneIn[1].u_width*pPlaneIn[1].u_height)); - memset((void *)pPlaneIn[2].pac_data, 0, - (pPlaneIn[2].u_width*pPlaneIn[2].u_height)); - // Copy Y, U and V planes - memcpy((void *)pPlaneIn[0].pac_data, (void *)outPlane[0].pac_data, - (pPlaneIn[0].u_width*pPlaneIn[0].u_height)); - memcpy((void *)pPlaneIn[1].pac_data, (void *)outPlane[1].pac_data, - (pPlaneIn[1].u_width*pPlaneIn[1].u_height)); - memcpy((void *)pPlaneIn[2].pac_data, (void *)outPlane[2].pac_data, - (pPlaneIn[2].u_width*pPlaneIn[2].u_height)); - - free((void *)outPlane[0].pac_data); - free((void *)outPlane[1].pac_data); - free((void *)outPlane[2].pac_data); - - // Swap the width and height of the in plane - uint32_t temp = 0; - temp = pPlaneIn[0].u_width; - pPlaneIn[0].u_width = pPlaneIn[0].u_height; - pPlaneIn[0].u_height = temp; - pPlaneIn[0].u_stride = pPlaneIn[0].u_width; - - temp = pPlaneIn[1].u_width; - pPlaneIn[1].u_width = pPlaneIn[1].u_height; - pPlaneIn[1].u_height = temp; - pPlaneIn[1].u_stride = pPlaneIn[1].u_width; - - temp = pPlaneIn[2].u_width; - pPlaneIn[2].u_width = pPlaneIn[2].u_height; - pPlaneIn[2].u_height = temp; - pPlaneIn[2].u_stride = pPlaneIn[2].u_width; - } - - return err; -} - -M4OSA_ERR M4VSS3GPP_intSetYUV420Plane(M4VIFI_ImagePlane* planeIn, - M4OSA_UInt32 width, M4OSA_UInt32 height) { - - M4OSA_ERR err = M4NO_ERROR; - - if (planeIn == M4OSA_NULL) { - M4OSA_TRACE1_0("NULL in plane, error"); - return M4ERR_PARAMETER; - } - - planeIn[0].u_width = width; - planeIn[0].u_height = height; - planeIn[0].u_stride = planeIn[0].u_width; - - planeIn[1].u_width = width/2; - planeIn[1].u_height = height/2; - planeIn[1].u_stride = planeIn[1].u_width; - - planeIn[2].u_width = width/2; - planeIn[2].u_height = height/2; - planeIn[2].u_stride = planeIn[1].u_width; - - return err; -} diff --git a/libvideoeditor/vss/src/M4VSS3GPP_MediaAndCodecSubscription.c b/libvideoeditor/vss/src/M4VSS3GPP_MediaAndCodecSubscription.c deleted file mode 100755 index f30f705..0000000 --- a/libvideoeditor/vss/src/M4VSS3GPP_MediaAndCodecSubscription.c +++ /dev/null @@ -1,469 +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 M4VSS3GPP_MediaAndCodecSubscription.c - * @brief Media readers and codecs subscription - * @note This file implements the subscription of supported media - * readers and decoders for the VSS. Potential support can - * be activated or de-activated - * using compilation flags set in the projects settings. - ************************************************************************* - */ - -#include "NXPSW_CompilerSwitches.h" - - -#include "M4OSA_Debug.h" -#include "M4VSS3GPP_InternalTypes.h" /**< Include for VSS specific types */ -#include "M4VSS3GPP_InternalFunctions.h" /**< Registration module */ - -/* _______________________ */ -/*| |*/ -/*| reader subscription |*/ -/*|_______________________|*/ - -/* Reader registration : at least one reader must be defined */ -#ifndef M4VSS_SUPPORT_READER_3GP -#ifndef M4VSS_SUPPORT_READER_AMR -#ifndef M4VSS_SUPPORT_READER_MP3 -#ifndef M4VSS_SUPPORT_READER_PCM -#ifndef M4VSS_SUPPORT_AUDEC_NULL -#error "no reader registered" -#endif /* M4VSS_SUPPORT_AUDEC_NULL */ -#endif /* M4VSS_SUPPORT_READER_PCM */ -#endif /* M4VSS_SUPPORT_READER_MP3 */ -#endif /* M4VSS_SUPPORT_READER_AMR */ -#endif /* M4VSS_SUPPORT_READER_3GP */ - -/* There must be at least one MPEG4 decoder */ -#if !defined(M4VSS_SUPPORT_VIDEC_3GP) && !defined(M4VSS_ENABLE_EXTERNAL_DECODERS) -#error "Wait, what?" -/* "Hey, this is the VSS3GPP speaking. Pray tell, how the heck do you expect me to be able to do -any editing without a built-in video decoder, nor the possibility to receive an external one?! -Seriously, I'd love to know." */ -#endif - -/* Include files for each reader to subscribe */ -#ifdef M4VSS_SUPPORT_READER_3GP -#include "VideoEditor3gpReader.h" -#endif -#ifdef M4VSS_SUPPORT_READER_AMR -#include "M4READER_Amr.h" -#endif -#ifdef M4VSS_SUPPORT_READER_MP3 -#include "VideoEditorMp3Reader.h" -#endif -#ifdef M4VSS_SUPPORT_READER_PCM -#include "M4READER_Pcm.h" -#endif - - -/* ______________________________ */ -/*| |*/ -/*| audio decoder subscription |*/ -/*|______________________________|*/ - -#include "VideoEditorAudioDecoder.h" -#include "VideoEditorVideoDecoder.h" -#include "M4DECODER_Null.h" -#ifdef M4VSS_SUPPORT_AUDEC_NULL -#include "M4AD_Null.h" -#endif - -/* _______________________ */ -/*| |*/ -/*| writer subscription |*/ -/*|_______________________|*/ - -/* Writer registration : at least one writer must be defined */ -//#ifndef M4VSS_SUPPORT_WRITER_AMR -#ifndef M4VSS_SUPPORT_WRITER_3GPP -#error "no writer registered" -#endif /* M4VSS_SUPPORT_WRITER_3GPP */ -//#endif /* M4VSS_SUPPORT_WRITER_AMR */ - -/* Include files for each writer to subscribe */ -//#ifdef M4VSS_SUPPORT_WRITER_AMR -/*extern M4OSA_ERR M4WRITER_AMR_getInterfaces( M4WRITER_OutputFileType* Type, -M4WRITER_GlobalInterface** SrcGlobalInterface, -M4WRITER_DataInterface** SrcDataInterface);*/ -//#endif -#ifdef M4VSS_SUPPORT_WRITER_3GPP -extern M4OSA_ERR M4WRITER_3GP_getInterfaces( M4WRITER_OutputFileType* Type, - M4WRITER_GlobalInterface** SrcGlobalInterface, - M4WRITER_DataInterface** SrcDataInterface); -#endif - -/* ______________________________ */ -/*| |*/ -/*| video encoder subscription |*/ -/*|______________________________|*/ -#include "VideoEditorAudioEncoder.h" -#include "VideoEditorVideoEncoder.h" - - -/* ______________________________ */ -/*| |*/ -/*| audio encoder subscription |*/ -/*|______________________________|*/ - - -#define M4ERR_CHECK_NULL_RETURN_VALUE(retval, pointer) if ((pointer) == M4OSA_NULL)\ - return ((M4OSA_ERR)(retval)); - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_SubscribeMediaAndCodec() - * @brief This function registers the reader, decoders, writers and encoders - * in the VSS. - * @note - * @param pContext: (IN) Execution context. - * @return M4NO_ERROR: there is no error - * @return M4ERR_PARAMETER pContext is NULL - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_subscribeMediaAndCodec(M4VSS3GPP_MediaAndCodecCtxt *pContext) -{ - M4OSA_ERR err = M4NO_ERROR; - - M4READER_MediaType readerMediaType; - M4READER_GlobalInterface* pReaderGlobalInterface; - M4READER_DataInterface* pReaderDataInterface; - - M4WRITER_OutputFileType writerMediaType; - M4WRITER_GlobalInterface* pWriterGlobalInterface; - M4WRITER_DataInterface* pWriterDataInterface; - - M4AD_Type audioDecoderType; - M4ENCODER_AudioFormat audioCodecType; - M4ENCODER_AudioGlobalInterface* pAudioCodecInterface; - M4AD_Interface* pAudioDecoderInterface; - - M4DECODER_VideoType videoDecoderType; - M4ENCODER_Format videoCodecType; - M4ENCODER_GlobalInterface* pVideoCodecInterface; - M4DECODER_VideoInterface* pVideoDecoderInterface; - - M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext); - - /* _______________________ */ - /*| |*/ - /*| reader subscription |*/ - /*|_______________________|*/ - - /* --- 3GP --- */ - -#ifdef M4VSS_SUPPORT_READER_3GP - err = VideoEditor3gpReader_getInterface( &readerMediaType, &pReaderGlobalInterface, - &pReaderDataInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4READER_3GP interface allocation error"); - return err; - } - err = M4VSS3GPP_registerReader( pContext, readerMediaType, pReaderGlobalInterface, - pReaderDataInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register 3GP reader"); -#endif /* M4VSS_SUPPORT_READER_3GP */ - - /* --- AMR --- */ - -#ifdef M4VSS_SUPPORT_READER_AMR - err = M4READER_AMR_getInterfaces( &readerMediaType, &pReaderGlobalInterface, - &pReaderDataInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4READER_AMR interface allocation error"); - return err; - } - err = M4VSS3GPP_registerReader( pContext, readerMediaType, pReaderGlobalInterface, - pReaderDataInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register AMR reader"); -#endif /* M4VSS_SUPPORT_READER_AMR */ - - /* --- MP3 --- */ - -#ifdef M4VSS_SUPPORT_READER_MP3 - err = VideoEditorMp3Reader_getInterface( &readerMediaType, &pReaderGlobalInterface, - &pReaderDataInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4READER_MP3 interface allocation error"); - return err; - } - err = M4VSS3GPP_registerReader( pContext, readerMediaType, pReaderGlobalInterface, - pReaderDataInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register MP3 reader"); -#endif /* M4VSS_SUPPORT_READER_MP3 */ - - /* --- PCM --- */ - -#ifdef M4VSS_SUPPORT_READER_PCM - err = M4READER_PCM_getInterfaces( &readerMediaType, &pReaderGlobalInterface, - &pReaderDataInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4READER_PCM interface allocation error"); - return err; - } - err = M4VSS3GPP_registerReader( pContext, readerMediaType, pReaderGlobalInterface, - pReaderDataInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register PCM reader"); -#endif /* M4VSS_SUPPORT_READER_PCM */ - - /* ______________________________ */ - /*| |*/ - /*| video decoder subscription |*/ - /*|______________________________|*/ - - /* --- MPEG4 & H263 --- */ - -#ifdef M4VSS_SUPPORT_VIDEC_3GP - err = VideoEditorVideoDecoder_getInterface_MPEG4(&videoDecoderType, (M4OSA_Void *)&pVideoDecoderInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4DECODER_MPEG4 interface allocation error"); - return err; - } - err = M4VSS3GPP_registerVideoDecoder( pContext, videoDecoderType, pVideoDecoderInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register MPEG4 decoder"); -#endif /* M4VSS_SUPPORT_VIDEC_3GP */ - -#ifdef M4VSS_SUPPORT_VIDEO_AVC - err = VideoEditorVideoDecoder_getInterface_H264(&videoDecoderType, (M4OSA_Void *)&pVideoDecoderInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4DECODER_H264 interface allocation error"); - return err; - } - err = M4VSS3GPP_registerVideoDecoder( pContext, videoDecoderType, pVideoDecoderInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register H264 decoder"); -#endif /* M4VSS_SUPPORT_VIDEC_3GP */ - -#ifdef M4VSS_SUPPORT_VIDEC_NULL - err = M4DECODER_NULL_getInterface( - &videoDecoderType, &pVideoDecoderInterface); - if (M4NO_ERROR != err) { - M4OSA_TRACE1_0("M4VD NULL Decoder interface allocation error"); - return err; - } - err = M4VSS3GPP_registerVideoDecoder( - pContext, videoDecoderType, pVideoDecoderInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, "M4VSS3GPP_subscribeMediaAndCodec: \ - can't register video NULL decoder"); -#endif - /* ______________________________ */ - /*| |*/ - /*| audio decoder subscription |*/ - /*|______________________________|*/ - - /* --- AMRNB --- */ - -#ifdef M4VSS_SUPPORT_AUDEC_AMRNB - err = VideoEditorAudioDecoder_getInterface_AMRNB(&audioDecoderType, &pAudioDecoderInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4 AMRNB interface allocation error"); - return err; - } - err = M4VSS3GPP_registerAudioDecoder( pContext, audioDecoderType, pAudioDecoderInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register AMRNB decoder"); -#endif /* M4VSS_SUPPORT_AUDEC_AMRNB */ - - /* --- AAC --- */ - -#ifdef M4VSS_SUPPORT_AUDEC_AAC - err = VideoEditorAudioDecoder_getInterface_AAC(&audioDecoderType, &pAudioDecoderInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4 AAC interface allocation error"); - return err; - } - err = M4VSS3GPP_registerAudioDecoder( pContext, audioDecoderType, pAudioDecoderInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register AAC decoder"); -#endif /* M4VSS_SUPPORT_AUDEC_AAC */ - - /* --- MP3 --- */ - -#ifdef M4VSS_SUPPORT_AUDEC_MP3 - err = VideoEditorAudioDecoder_getInterface_MP3(&audioDecoderType, &pAudioDecoderInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4 MP3 interface allocation error"); - return err; - } - err = M4VSS3GPP_registerAudioDecoder( pContext, audioDecoderType, pAudioDecoderInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register MP3 decoder"); -#endif /* M4VSS_SUPPORT_AUDEC_MP3 */ - - - /* --- NULL --- */ - -#ifdef M4VSS_SUPPORT_AUDEC_NULL - err = M4AD_NULL_getInterface( &audioDecoderType, &pAudioDecoderInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4AD NULL Decoder interface allocation error"); - return err; - } - err = M4VSS3GPP_registerAudioDecoder( pContext, audioDecoderType, pAudioDecoderInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register EVRC decoder"); -#endif /* M4VSS_SUPPORT_AUDEC_NULL */ - - /* _______________________ */ - /*| |*/ - /*| writer subscription |*/ - /*|_______________________|*/ - - - /* --- 3GPP --- */ - -#ifdef M4VSS_SUPPORT_WRITER_3GPP - /* retrieves the 3GPP writer media type and pointer to functions*/ - err = M4WRITER_3GP_getInterfaces( &writerMediaType, &pWriterGlobalInterface, - &pWriterDataInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4WRITER_3GP interface allocation error"); - return err; - } - err = M4VSS3GPP_registerWriter( pContext, writerMediaType, pWriterGlobalInterface, - pWriterDataInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register 3GPP writer"); -#endif /* M4VSS_SUPPORT_WRITER_3GPP */ - - /* ______________________________ */ - /*| |*/ - /*| video encoder subscription |*/ - /*|______________________________|*/ - - /* --- MPEG4 --- */ - -#ifdef M4VSS_SUPPORT_ENCODER_MPEG4 - /* retrieves the MPEG4 encoder type and pointer to functions*/ - err = VideoEditorVideoEncoder_getInterface_MPEG4(&videoCodecType, &pVideoCodecInterface, - M4ENCODER_OPEN_ADVANCED); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4MP4E_MPEG4 interface allocation error"); - return err; - } - err = M4VSS3GPP_registerVideoEncoder( pContext, videoCodecType, pVideoCodecInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register video MPEG4 encoder"); -#endif /* M4VSS_SUPPORT_ENCODER_MPEG4 */ - - /* --- H263 --- */ - -#ifdef M4VSS_SUPPORT_ENCODER_MPEG4 - /* retrieves the H263 encoder type and pointer to functions*/ - err = VideoEditorVideoEncoder_getInterface_H263(&videoCodecType, &pVideoCodecInterface, - M4ENCODER_OPEN_ADVANCED); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4MP4E_H263 interface allocation error"); - return err; - } - err = M4VSS3GPP_registerVideoEncoder( pContext, videoCodecType, pVideoCodecInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register video H263 encoder"); -#endif /* M4VSS_SUPPORT_ENCODER_MPEG4 */ - -#ifdef M4VSS_SUPPORT_ENCODER_AVC - /* retrieves the H264 encoder type and pointer to functions*/ - err = VideoEditorVideoEncoder_getInterface_H264(&videoCodecType, &pVideoCodecInterface, - M4ENCODER_OPEN_ADVANCED); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4VSS3GPP_subscribeMediaAndCodec: M4H264E interface allocation error"); - return err; - } - err = M4VSS3GPP_registerVideoEncoder( pContext, videoCodecType, pVideoCodecInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register video H264 encoder"); -#endif /* M4VSS_SUPPORT_ENCODER_AVC */ - - /* ______________________________ */ - /*| |*/ - /*| audio encoder subscription |*/ - /*|______________________________|*/ - - /* --- AMR --- */ - -#ifdef M4VSS_SUPPORT_ENCODER_AMR - /* retrieves the AMR encoder type and pointer to functions*/ - err = VideoEditorAudioEncoder_getInterface_AMRNB(&audioCodecType, &pAudioCodecInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4AMR interface allocation error"); - return err; - } - err = M4VSS3GPP_registerAudioEncoder( pContext, audioCodecType, pAudioCodecInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register audio AMR encoder"); -#endif /* M4VSS_SUPPORT_ENCODER_AMR */ - - /* --- AAC --- */ - -#ifdef M4VSS_SUPPORT_ENCODER_AAC - /* retrieves the AAC encoder type and pointer to functions*/ - err = VideoEditorAudioEncoder_getInterface_AAC(&audioCodecType, &pAudioCodecInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4AAC interface allocation error"); - return err; - } - err = M4VSS3GPP_registerAudioEncoder( pContext, audioCodecType, pAudioCodecInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register audio AAC encoder"); -#endif /* M4VSS_SUPPORT_ENCODER_AAC */ - - /* --- EVRC --- */ - -#ifdef M4VSS_SUPPORT_ENCODER_EVRC - /* retrieves the EVRC encoder type and pointer to functions*/ - err = M4EVRC_getInterfaces( &audioCodecType, &pAudioCodecInterface); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_0("M4EVRC interface allocation error"); - return err; - } - err = M4VSS3GPP_registerAudioEncoder( pContext, audioCodecType, pAudioCodecInterface); - M4OSA_DEBUG_IF1((err != M4NO_ERROR), err, - "M4VSS3GPP_subscribeMediaAndCodec: can't register audio EVRC encoder"); -#endif /* M4VSS_SUPPORT_ENCODER_EVRC */ - -#ifdef M4VSS_SUPPORT_OMX_CODECS - pContext->bAllowFreeingOMXCodecInterface = M4OSA_TRUE; /* when NXP SW codecs are registered, - then allow unregistration*/ -#endif - - - return err; -} - diff --git a/libvideoeditor/vss/src/M4xVSS_API.c b/libvideoeditor/vss/src/M4xVSS_API.c deleted file mode 100755 index 9f5410b..0000000 --- a/libvideoeditor/vss/src/M4xVSS_API.c +++ /dev/null @@ -1,6367 +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 M4xVSS_API.c - * @brief API of eXtended Video Studio Service (Video Studio 2.1) - * @note - ****************************************************************************** - */ - -/** - * OSAL main types and errors ***/ -#include "M4OSA_Types.h" -#include "M4OSA_Error.h" -#include "M4OSA_Memory.h" -#include "M4OSA_Debug.h" -#include "M4OSA_FileReader.h" -#include "M4OSA_FileWriter.h" -#include "M4OSA_CoreID.h" -#include "M4OSA_CharStar.h" -// StageFright encoders require %16 resolution -#include "M4ENCODER_common.h" -#include "M4DECODER_Common.h" -#include "VideoEditorVideoDecoder.h" - -/** - * VSS 3GPP API definition */ -#include "M4VSS3GPP_ErrorCodes.h" - -/************************* -Begin of xVSS API - **************************/ - -#include "M4xVSS_API.h" -#include "M4xVSS_Internal.h" - -/* RC: to delete unecessary temp files on the fly */ -#include "M4VSS3GPP_InternalTypes.h" -#include <utils/Log.h> - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_Init(M4OSA_Context* pContext, M4xVSS_InitParams* pParams) - * @brief This function initializes the xVSS - * @note Initializes the xVSS edit operation (allocates an execution context). - * - * @param pContext (OUT) Pointer on the xVSS edit context to allocate - * @param params (IN) Parameters mandatory for xVSS - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_ALLOC: Memory allocation has failed - ****************************************************************************** - */ - -M4OSA_ERR M4xVSS_Init( M4OSA_Context *pContext, M4xVSS_InitParams *pParams ) -{ - M4xVSS_Context *xVSS_context; - M4OSA_UInt32 length = 0, i; - - if( pParams == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Parameter structure for M4xVSS_Init function is NULL"); - return M4ERR_PARAMETER; - } - - if( pParams->pFileReadPtr == M4OSA_NULL - || pParams->pFileWritePtr == M4OSA_NULL ) - { - M4OSA_TRACE1_0( - "pFileReadPtr or pFileWritePtr in M4xVSS_InitParams structure is NULL"); - return M4ERR_PARAMETER; - } - - xVSS_context = (M4xVSS_Context *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_Context), M4VS, - (M4OSA_Char *)"Context of the xVSS layer"); - - if( xVSS_context == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_Init"); - return M4ERR_ALLOC; - } - - /* Initialize file read/write functions pointers */ - xVSS_context->pFileReadPtr = pParams->pFileReadPtr; - xVSS_context->pFileWritePtr = pParams->pFileWritePtr; - - /*UTF Conversion support: copy conversion functions pointers and allocate the temporary - buffer*/ - if( pParams->pConvFromUTF8Fct != M4OSA_NULL ) - { - if( pParams->pConvToUTF8Fct != M4OSA_NULL ) - { - xVSS_context->UTFConversionContext.pConvFromUTF8Fct = - pParams->pConvFromUTF8Fct; - xVSS_context->UTFConversionContext.pConvToUTF8Fct = - pParams->pConvToUTF8Fct; - xVSS_context->UTFConversionContext.m_TempOutConversionSize = - UTF_CONVERSION_BUFFER_SIZE; - xVSS_context->UTFConversionContext.pTempOutConversionBuffer = - (M4OSA_Void *)M4OSA_32bitAlignedMalloc(UTF_CONVERSION_BUFFER_SIZE - * sizeof(M4OSA_UInt8), - M4VA, (M4OSA_Char *)"M4xVSS_Init: UTF conversion buffer"); - - if( M4OSA_NULL - == xVSS_context->UTFConversionContext.pTempOutConversionBuffer ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_Init"); - free(xVSS_context->pTempPath); - xVSS_context->pTempPath = M4OSA_NULL; - free(xVSS_context); - xVSS_context = M4OSA_NULL; - return M4ERR_ALLOC; - } - } - else - { - M4OSA_TRACE1_0("M4xVSS_Init: one UTF conversion pointer is null and the other\ - is not null"); - free(xVSS_context->pTempPath); - xVSS_context->pTempPath = M4OSA_NULL; - free(xVSS_context); - xVSS_context = M4OSA_NULL; - return M4ERR_PARAMETER; - } - } - else - { - xVSS_context->UTFConversionContext.pConvFromUTF8Fct = M4OSA_NULL; - xVSS_context->UTFConversionContext.pConvToUTF8Fct = M4OSA_NULL; - xVSS_context->UTFConversionContext.m_TempOutConversionSize = 0; - xVSS_context->UTFConversionContext.pTempOutConversionBuffer = - M4OSA_NULL; - } - - if( pParams->pTempPath != M4OSA_NULL ) - { - /*No need to convert into UTF8 as all input of xVSS are in UTF8 - (the conversion customer format into UTF8 - is done in VA/VAL)*/ - xVSS_context->pTempPath = - (M4OSA_Void *)M4OSA_32bitAlignedMalloc(strlen(pParams->pTempPath) + 1, - M4VS, (M4OSA_Char *)"xVSS Path for temporary files"); - - if( xVSS_context->pTempPath == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_Init"); - return M4ERR_ALLOC; - } - memcpy((void *)xVSS_context->pTempPath, (void *)pParams->pTempPath, - strlen(pParams->pTempPath) + 1); - /* TODO: Check that no previous xVSS temporary files are present ? */ - } - else - { - M4OSA_TRACE1_0("Path for temporary files is NULL"); - free(xVSS_context); - xVSS_context = M4OSA_NULL; - return M4ERR_PARAMETER; - } - - xVSS_context->pSettings = - (M4VSS3GPP_EditSettings *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_EditSettings), - M4VS, (M4OSA_Char *)"Copy of VSS structure"); - - if( xVSS_context->pSettings == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_Init"); - free(xVSS_context->pTempPath); - xVSS_context->pTempPath = M4OSA_NULL; - free(xVSS_context); - xVSS_context = M4OSA_NULL; - return M4ERR_ALLOC; - } - - /* Initialize pointers in pSettings */ - xVSS_context->pSettings->pClipList = M4OSA_NULL; - xVSS_context->pSettings->pTransitionList = M4OSA_NULL; - xVSS_context->pSettings->Effects = M4OSA_NULL; /* RC */ - xVSS_context->pSettings->xVSS.pBGMtrack = M4OSA_NULL; - - /* This is used to know if the user has added or removed some medias */ - xVSS_context->previousClipNumber = 0; - - /* "State machine" */ - xVSS_context->editingStep = 0; - xVSS_context->analyseStep = 0; - - xVSS_context->pcmPreviewFile = M4OSA_NULL; - - /* Initialize Pto3GPP and MCS lists */ - xVSS_context->pMCSparamsList = M4OSA_NULL; - xVSS_context->pPTo3GPPparamsList = M4OSA_NULL; - xVSS_context->pPTo3GPPcurrentParams = M4OSA_NULL; - xVSS_context->pMCScurrentParams = M4OSA_NULL; - - xVSS_context->tempFileIndex = 0; - - xVSS_context->targetedBitrate = 0; - - xVSS_context->targetedTimescale = 0; - - xVSS_context->pAudioMixContext = M4OSA_NULL; - xVSS_context->pAudioMixSettings = M4OSA_NULL; - - /*FB: initialize to avoid crash when error during the editing*/ - xVSS_context->pCurrentEditSettings = M4OSA_NULL; - - /* Initialize state if all initializations are corrects */ - xVSS_context->m_state = M4xVSS_kStateInitialized; - - /* initialize MCS context*/ - xVSS_context->pMCS_Ctxt = M4OSA_NULL; - - *pContext = xVSS_context; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * prototype M4xVSS_ReduceTranscode - * @brief This function changes the given editing structure in order to - * minimize the transcoding time. - * @note The xVSS analyses this structure, and if needed, changes the - * output parameters (Video codec, video size, audio codec, - * audio nb of channels) to minimize the transcoding time. - * - * @param pContext (OUT) Pointer on the xVSS edit context to allocate - * @param pSettings (IN) Edition settings (allocated by the user) - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_ALLOC: Memory allocation has failed - * @return M4ERR_STATE: This function cannot not be called at this time - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_ReduceTranscode( M4OSA_Context pContext, - M4VSS3GPP_EditSettings *pSettings ) -{ - M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext; - M4OSA_ERR err = M4NO_ERROR; - M4VIDEOEDITING_ClipProperties fileProperties; - M4OSA_UInt8 i, j; - M4OSA_Bool bAudioTransition = M4OSA_FALSE; - M4OSA_Bool bIsBGMReplace = M4OSA_FALSE; - M4OSA_Bool bFound; - M4OSA_UInt32 videoConfig[9] = - { - 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - /** Index <-> Video config **/ - /* 0: H263 SQCIF */ - /* 1: H263 QCIF */ - /* 2: H263 CIF */ - /* 3: MPEG4 SQCIF */ - /* 4: MPEG4 QQVGA */ - /* 5: MPEG4 QCIF */ - /* 6: MPEG4 QVGA */ - /* 7: MPEG4 CIF */ - /* 8: MPEG4 VGA */ - /****************************/ - M4OSA_UInt32 audioConfig[3] = - { - 0, 0, 0 - }; - /** Index <-> Audio config **/ - /* 0: AMR */ - /* 1: AAC 16kHz mono */ - /* 2: AAC 16kHz stereo */ - /****************************/ - - /* Check state */ - if( xVSS_context->m_state != M4xVSS_kStateInitialized \ - && xVSS_context->m_state != M4xVSS_kStateOpened ) - { - M4OSA_TRACE1_1( - "Bad state when calling M4xVSS_ReduceTranscode function! State is %d", - xVSS_context->m_state); - return M4ERR_STATE; - } - - /* Check number of clips */ - if( pSettings->uiClipNumber == 0 ) - { - M4OSA_TRACE1_0("The number of input clip must be greater than 0 !"); - return M4ERR_PARAMETER; - } - - /* Check if there is a background music, and if its audio will replace input clip audio */ - if( pSettings->xVSS.pBGMtrack != M4OSA_NULL ) - { - if( pSettings->xVSS.pBGMtrack->uiAddVolume == 100 ) - { - bIsBGMReplace = M4OSA_TRUE; - } - } - - /* Parse all clips, and give occurences of each combination */ - for ( i = 0; i < pSettings->uiClipNumber; i++ ) - { - /* We ignore JPG input files as they are always transcoded */ - if( pSettings->pClipList[i]->FileType == M4VIDEOEDITING_kFileType_3GPP ) - { - /** - * UTF conversion: convert into the customer format*/ - M4OSA_Void *pDecodedPath = pSettings->pClipList[i]->pFile; - M4OSA_UInt32 ConvertedSize = 0; - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)pSettings->pClipList[i]->pFile, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, - &ConvertedSize); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1("M4xVSS_ReduceTranscode:\ - M4xVSS_internalConvertFromUTF8 returns err: 0x%x", err); - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - /** - * End of the utf conversion, now use the converted path*/ - err = M4xVSS_internalGetProperties(xVSS_context, pDecodedPath, - &fileProperties); - - //err = M4xVSS_internalGetProperties(xVSS_context, pSettings->pClipList[i]->pFile, - // &fileProperties); - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_sendCommand: M4xVSS_internalGetProperties returned 0x%x", - err); - /* TODO: Translate error code of MCS to an xVSS error code ? */ - return err; - } - - /* Check best video settings */ - if( fileProperties.uiVideoWidth == 128 - && fileProperties.uiVideoHeight == 96 ) - { - if( fileProperties.VideoStreamType == M4VIDEOEDITING_kH263 ) - { - videoConfig[0] += fileProperties.uiClipVideoDuration; - } - else if( ( fileProperties.VideoStreamType - == M4VIDEOEDITING_kMPEG4) \ - || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) ) - { - videoConfig[3] += fileProperties.uiClipVideoDuration; - } - } - else if( fileProperties.uiVideoWidth == 160 - && fileProperties.uiVideoHeight == 120 ) - { - if( ( fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) \ - || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) ) - { - videoConfig[4] += fileProperties.uiClipVideoDuration; - } - } - else if( fileProperties.uiVideoWidth == 176 - && fileProperties.uiVideoHeight == 144 ) - { - if( fileProperties.VideoStreamType == M4VIDEOEDITING_kH263 ) - { - videoConfig[1] += fileProperties.uiClipVideoDuration; - } - else if( ( fileProperties.VideoStreamType - == M4VIDEOEDITING_kMPEG4) \ - || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) ) - { - videoConfig[5] += fileProperties.uiClipVideoDuration; - } - } - else if( fileProperties.uiVideoWidth == 320 - && fileProperties.uiVideoHeight == 240 ) - { - if( ( fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) \ - || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) ) - { - videoConfig[6] += fileProperties.uiClipVideoDuration; - } - } - else if( fileProperties.uiVideoWidth == 352 - && fileProperties.uiVideoHeight == 288 ) - { - if( fileProperties.VideoStreamType == M4VIDEOEDITING_kH263 ) - { - videoConfig[2] += fileProperties.uiClipVideoDuration; - } - else if( ( fileProperties.VideoStreamType - == M4VIDEOEDITING_kMPEG4) \ - || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) ) - { - videoConfig[7] += fileProperties.uiClipVideoDuration; - } - } - else if( fileProperties.uiVideoWidth == 640 - && fileProperties.uiVideoHeight == 480 ) - { - if( ( fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) \ - || (fileProperties.VideoStreamType == M4VIDEOEDITING_kH264) ) - { - videoConfig[8] += fileProperties.uiClipVideoDuration; - } - } - - /* If there is a BGM that replaces existing audio track, we do not care about - audio track as it will be replaced */ - /* If not, we try to minimize audio reencoding */ - if( bIsBGMReplace == M4OSA_FALSE ) - { - if( fileProperties.AudioStreamType == M4VIDEOEDITING_kAAC ) - { - if( fileProperties.uiSamplingFrequency == 16000 && \ - fileProperties.uiNbChannels == 1 ) - { - audioConfig[1] += fileProperties.uiClipAudioDuration; - } - else if( fileProperties.uiSamplingFrequency == 16000 && \ - fileProperties.uiNbChannels == 2 ) - { - audioConfig[2] += fileProperties.uiClipAudioDuration; - } - } - else if( fileProperties.AudioStreamType - == M4VIDEOEDITING_kAMR_NB ) - { - audioConfig[0] += fileProperties.uiClipAudioDuration; - } - } - } - } - - /* Find best output video format (the most occuring combination) */ - j = 0; - bFound = M4OSA_FALSE; - - for ( i = 0; i < 9; i++ ) - { - if( videoConfig[i] >= videoConfig[j] ) - { - j = i; - bFound = M4OSA_TRUE; - } - } - - if( bFound ) - { - switch( j ) - { - case 0: - pSettings->xVSS.outputVideoFormat = M4VIDEOEDITING_kH263; - pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kSQCIF; - break; - - case 1: - pSettings->xVSS.outputVideoFormat = M4VIDEOEDITING_kH263; - pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kQCIF; - break; - - case 2: - pSettings->xVSS.outputVideoFormat = M4VIDEOEDITING_kH263; - pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kCIF; - break; - - case 3: - pSettings->xVSS.outputVideoFormat = - (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) - ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264; - pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kSQCIF; - break; - - case 4: - pSettings->xVSS.outputVideoFormat = - (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) - ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264; - pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kQQVGA; - break; - - case 5: - pSettings->xVSS.outputVideoFormat = - (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) - ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264; - pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kQCIF; - break; - - case 6: - pSettings->xVSS.outputVideoFormat = - (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) - ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264; - pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kQVGA; - break; - - case 7: - pSettings->xVSS.outputVideoFormat = - (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) - ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264; - pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kCIF; - break; - - case 8: - pSettings->xVSS.outputVideoFormat = - (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) - ? M4VIDEOEDITING_kMPEG4 : M4VIDEOEDITING_kH264; - pSettings->xVSS.outputVideoSize = M4VIDEOEDITING_kVGA; - break; - } - } - - /* Find best output audio format (the most occuring combination) */ - j = 0; - bFound = M4OSA_FALSE; - - for ( i = 0; i < 3; i++ ) - { - if( audioConfig[i] >= audioConfig[j] ) - { - j = i; - bFound = M4OSA_TRUE; - } - } - - if( bFound ) - { - switch( j ) - { - case 0: - pSettings->xVSS.outputAudioFormat = M4VIDEOEDITING_kAMR_NB; - pSettings->xVSS.bAudioMono = M4OSA_TRUE; - break; - - case 1: - pSettings->xVSS.outputAudioFormat = M4VIDEOEDITING_kAAC; - pSettings->xVSS.bAudioMono = M4OSA_TRUE; - break; - - case 2: - pSettings->xVSS.outputAudioFormat = M4VIDEOEDITING_kAAC; - pSettings->xVSS.bAudioMono = M4OSA_FALSE; - break; - } - } - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_SendCommand(M4OSA_Context pContext, - * M4VSS3GPP_EditSettings* pSettings) - * @brief This function gives to the xVSS an editing structure - * @note The xVSS analyses this structure, and prepare edition - * This function must be called after M4xVSS_Init, after - * M4xVSS_CloseCommand, or after M4xVSS_PreviewStop. - * After this function, the user must call M4xVSS_Step until - * it returns another error than M4NO_ERROR. - * - * @param pContext (IN) Pointer on the xVSS edit context - * @param pSettings (IN) Edition settings (allocated by the user) - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_ALLOC: Memory allocation has failed - * @return M4ERR_STATE: This function cannot not be called at this time - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_SendCommand( M4OSA_Context pContext, - M4VSS3GPP_EditSettings *pSettings ) -{ - M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext; - M4OSA_UInt8 i, j; - M4OSA_UInt8 nbOfSameClip = 0; - M4OSA_ERR err; - M4OSA_Bool isNewBGM = M4OSA_TRUE; - M4xVSS_Pto3GPP_params *pPto3GPP_last = M4OSA_NULL; - M4xVSS_MCS_params *pMCS_last = M4OSA_NULL; - M4OSA_UInt32 width, height, samplingFreq; - M4OSA_Bool bIsTranscoding = M4OSA_FALSE; - M4OSA_Int32 totalDuration; - M4OSA_UInt32 outputSamplingFrequency = 0; - M4OSA_UInt32 length = 0; - M4OSA_Int8 masterClip = -1; - - i = 0; - /* Check state */ - if( xVSS_context->m_state != M4xVSS_kStateInitialized \ - && xVSS_context->m_state != M4xVSS_kStateOpened ) - { - M4OSA_TRACE1_1( - "Bad state when calling M4xVSS_SendCommand function! State is %d", - xVSS_context->m_state); - return M4ERR_STATE; - } - - /* State is back to initialized to allow call of cleanup function in case of error */ - xVSS_context->m_state = M4xVSS_kStateInitialized; - - /* Check if a previous sendCommand has been called */ - if( xVSS_context->previousClipNumber != 0 ) - { - M4OSA_UInt32 pCmpResult = 0; - - /* Compare BGM input */ - if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL \ - && pSettings->xVSS.pBGMtrack != M4OSA_NULL ) - { - pCmpResult = strcmp((const char *)xVSS_context->pSettings->xVSS.pBGMtrack->pFile, - (const char *)pSettings->xVSS.pBGMtrack->pFile); - - if( pCmpResult == 0 ) - { - /* Check if audio output parameters have changed */ - if( xVSS_context->pSettings->xVSS.outputAudioFormat == - pSettings->xVSS.outputAudioFormat - && xVSS_context->pSettings->xVSS.bAudioMono - == pSettings->xVSS.bAudioMono ) - { - /* It means that BGM is the same as before, so, no need to redecode it */ - M4OSA_TRACE2_0( - "BGM is the same as before, nothing to decode"); - isNewBGM = M4OSA_FALSE; - } - else - { - /* We need to unallocate PCM preview file path in internal context */ - if( xVSS_context->pcmPreviewFile != M4OSA_NULL ) - { - free(xVSS_context->pcmPreviewFile); - xVSS_context->pcmPreviewFile = M4OSA_NULL; - } - } - } - else - { - /* We need to unallocate PCM preview file path in internal context */ - if( xVSS_context->pcmPreviewFile != M4OSA_NULL ) - { - free(xVSS_context->pcmPreviewFile); - xVSS_context->pcmPreviewFile = M4OSA_NULL; - } - } - } - - /* Check if output settings have changed */ - if( xVSS_context->pSettings->xVSS.outputVideoSize - != pSettings->xVSS.outputVideoSize - || xVSS_context->pSettings->xVSS.outputVideoFormat - != pSettings->xVSS.outputVideoFormat - || xVSS_context->pSettings->xVSS.outputVideoProfile - != pSettings->xVSS.outputVideoProfile - || xVSS_context->pSettings->xVSS.outputVideoLevel - != pSettings->xVSS.outputVideoLevel - || xVSS_context->pSettings->xVSS.outputAudioFormat - != pSettings->xVSS.outputAudioFormat - || xVSS_context->pSettings->xVSS.bAudioMono - != pSettings->xVSS.bAudioMono - || xVSS_context->pSettings->xVSS.outputAudioSamplFreq - != pSettings->xVSS.outputAudioSamplFreq ) - { - /* If it is the case, we can't reuse already transcoded/converted files */ - /* so, we delete these files and remove them from chained list */ - if( xVSS_context->pPTo3GPPparamsList != M4OSA_NULL ) - { - M4xVSS_Pto3GPP_params *pParams = - xVSS_context->pPTo3GPPparamsList; - M4xVSS_Pto3GPP_params *pParams_sauv; - - while( pParams != M4OSA_NULL ) - { - if( pParams->pFileIn != M4OSA_NULL ) - { - free(pParams->pFileIn); - pParams->pFileIn = M4OSA_NULL; - } - - if( pParams->pFileOut != M4OSA_NULL ) - { - /* Delete temporary file */ - remove((const char *)pParams->pFileOut); - free(pParams->pFileOut); - pParams->pFileOut = M4OSA_NULL; - } - - if( pParams->pFileTemp != M4OSA_NULL ) - { - /* Delete temporary file */ -#ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE - - remove((const char *)pParams->pFileTemp); - free(pParams->pFileTemp); - -#endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/ - - pParams->pFileTemp = M4OSA_NULL; - } - pParams_sauv = pParams; - pParams = pParams->pNext; - free(pParams_sauv); - pParams_sauv = M4OSA_NULL; - } - xVSS_context->pPTo3GPPparamsList = M4OSA_NULL; - } - - if( xVSS_context->pMCSparamsList != M4OSA_NULL ) - { - M4xVSS_MCS_params *pParams = xVSS_context->pMCSparamsList; - M4xVSS_MCS_params *pParams_sauv; - M4xVSS_MCS_params *pParams_bgm = M4OSA_NULL; - - while( pParams != M4OSA_NULL ) - { - /* Here, we do not delete BGM */ - if( pParams->isBGM != M4OSA_TRUE ) - { - if( pParams->pFileIn != M4OSA_NULL ) - { - free(pParams->pFileIn); - pParams->pFileIn = M4OSA_NULL; - } - - if( pParams->pFileOut != M4OSA_NULL ) - { - /* Delete temporary file */ - remove((const char *)pParams->pFileOut); - free(pParams->pFileOut); - pParams->pFileOut = M4OSA_NULL; - } - - if( pParams->pFileTemp != M4OSA_NULL ) - { - /* Delete temporary file */ -#ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE - - remove((const char *)pParams->pFileTemp); - free(pParams->pFileTemp); - -#endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/ - - pParams->pFileTemp = M4OSA_NULL; - } - pParams_sauv = pParams; - pParams = pParams->pNext; - free(pParams_sauv); - pParams_sauv = M4OSA_NULL; - } - else - { - pParams_bgm = pParams; - pParams = pParams->pNext; - /*PR P4ME00003182 initialize this pointer because the following params - element will be deallocated*/ - if( pParams != M4OSA_NULL - && pParams->isBGM != M4OSA_TRUE ) - { - pParams_bgm->pNext = M4OSA_NULL; - } - } - } - xVSS_context->pMCSparamsList = pParams_bgm; - } - /* Maybe need to implement framerate changing */ - //xVSS_context->pSettings->videoFrameRate; - } - - /* Unallocate previous xVSS_context->pSettings structure */ - M4xVSS_freeSettings(xVSS_context->pSettings); - - /*Unallocate output file path*/ - if( xVSS_context->pSettings->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pSettings->pOutputFile); - xVSS_context->pSettings->pOutputFile = M4OSA_NULL; - } - xVSS_context->pSettings->uiOutputPathSize = 0; - xVSS_context->pOutputFile = M4OSA_NULL; - } - - /********************************** - Clips registering - **********************************/ - - /* Copy settings from user given structure to our "local" structure */ - xVSS_context->pSettings->xVSS.outputVideoFormat = - pSettings->xVSS.outputVideoFormat; - xVSS_context->pSettings->xVSS.outputVideoProfile = - pSettings->xVSS.outputVideoProfile; - xVSS_context->pSettings->xVSS.outputVideoLevel = - pSettings->xVSS.outputVideoLevel; - xVSS_context->pSettings->xVSS.outputVideoSize = - pSettings->xVSS.outputVideoSize; - xVSS_context->pSettings->xVSS.outputAudioFormat = - pSettings->xVSS.outputAudioFormat; - xVSS_context->pSettings->xVSS.bAudioMono = pSettings->xVSS.bAudioMono; - xVSS_context->pSettings->xVSS.outputAudioSamplFreq = - pSettings->xVSS.outputAudioSamplFreq; - /*xVSS_context->pSettings->pOutputFile = pSettings->pOutputFile;*/ - /*FB: VAL CR P4ME00003076 - The output video and audio bitrate are given by the user in the edition settings structure*/ - xVSS_context->pSettings->xVSS.outputVideoBitrate = - pSettings->xVSS.outputVideoBitrate; - xVSS_context->pSettings->xVSS.outputAudioBitrate = - pSettings->xVSS.outputAudioBitrate; - xVSS_context->pSettings->PTVolLevel = pSettings->PTVolLevel; - - /*FB: bug fix if the output path is given in M4xVSS_sendCommand*/ - - if( pSettings->pOutputFile != M4OSA_NULL - && pSettings->uiOutputPathSize > 0 ) - { - M4OSA_Void *pDecodedPath = pSettings->pOutputFile; - /*As all inputs of the xVSS are in UTF8, convert the output file path into the - customer format*/ - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)pSettings->pOutputFile, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1("M4xVSS_SendCommand:\ - M4xVSS_internalConvertFromUTF8 returns err: 0x%x", err); - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - pSettings->uiOutputPathSize = length; - } - - xVSS_context->pSettings->pOutputFile = (M4OSA_Void *)M4OSA_32bitAlignedMalloc \ - (pSettings->uiOutputPathSize + 1, M4VS, - (M4OSA_Char *)"output file path"); - - if( xVSS_context->pSettings->pOutputFile == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - memcpy((void *)xVSS_context->pSettings->pOutputFile, - (void *)pDecodedPath, pSettings->uiOutputPathSize + 1); - xVSS_context->pSettings->uiOutputPathSize = pSettings->uiOutputPathSize; - xVSS_context->pOutputFile = xVSS_context->pSettings->pOutputFile; - } - else - { - xVSS_context->pSettings->pOutputFile = M4OSA_NULL; - xVSS_context->pSettings->uiOutputPathSize = 0; - xVSS_context->pOutputFile = M4OSA_NULL; - } - xVSS_context->pSettings->pTemporaryFile = pSettings->pTemporaryFile; - xVSS_context->pSettings->uiClipNumber = pSettings->uiClipNumber; - xVSS_context->pSettings->videoFrameRate = pSettings->videoFrameRate; - xVSS_context->pSettings->uiMasterClip = - 0; /* With VSS 2.0, this new param is mandatory */ - xVSS_context->pSettings->xVSS.pTextRenderingFct = - pSettings->xVSS.pTextRenderingFct; /* CR text handling */ - xVSS_context->pSettings->xVSS.outputFileSize = - pSettings->xVSS.outputFileSize; - - if( pSettings->xVSS.outputFileSize != 0 \ - && pSettings->xVSS.outputAudioFormat != M4VIDEOEDITING_kAMR_NB ) - { - M4OSA_TRACE1_0("M4xVSS_SendCommand: Impossible to limit file\ - size with other audio output than AAC"); - return M4ERR_PARAMETER; - } - xVSS_context->nbStepTotal = 0; - xVSS_context->currentStep = 0; - - if( xVSS_context->pSettings->xVSS.outputVideoFormat != M4VIDEOEDITING_kMPEG4 - && xVSS_context->pSettings->xVSS.outputVideoFormat - != M4VIDEOEDITING_kH263 - && xVSS_context->pSettings->xVSS.outputVideoFormat - != M4VIDEOEDITING_kH264 ) - { - xVSS_context->pSettings->xVSS.outputVideoFormat = - M4VIDEOEDITING_kNoneVideo; - } - - /* Get output width/height */ - switch( xVSS_context->pSettings->xVSS.outputVideoSize ) - { - case M4VIDEOEDITING_kSQCIF: - width = 128; - height = 96; - break; - - case M4VIDEOEDITING_kQQVGA: - width = 160; - height = 120; - break; - - case M4VIDEOEDITING_kQCIF: - width = 176; - height = 144; - break; - - case M4VIDEOEDITING_kQVGA: - width = 320; - height = 240; - break; - - case M4VIDEOEDITING_kCIF: - width = 352; - height = 288; - break; - - case M4VIDEOEDITING_kVGA: - width = 640; - height = 480; - break; - /* +PR LV5807 */ - case M4VIDEOEDITING_kWVGA: - width = 800; - height = 480; - break; - - case M4VIDEOEDITING_kNTSC: - width = 720; - height = 480; - break; - /* -PR LV5807 */ - /* +CR Google */ - case M4VIDEOEDITING_k640_360: - width = 640; - height = 360; - break; - - case M4VIDEOEDITING_k854_480: - - // StageFright encoders require %16 resolution - - width = M4ENCODER_854_480_Width; - - height = 480; - break; - - case M4VIDEOEDITING_k1280_720: - width = 1280; - height = 720; - break; - - case M4VIDEOEDITING_k1080_720: - // StageFright encoders require %16 resolution - width = M4ENCODER_1080_720_Width; - height = 720; - break; - - case M4VIDEOEDITING_k960_720: - width = 960; - height = 720; - break; - - case M4VIDEOEDITING_k1920_1080: - width = 1920; - height = M4ENCODER_1920_1080_Height; - break; - - /* -CR Google */ - default: /* If output video size is not given, we take QCIF size */ - width = 176; - height = 144; - xVSS_context->pSettings->xVSS.outputVideoSize = - M4VIDEOEDITING_kQCIF; - break; - } - - /* Get output Sampling frequency */ - switch( xVSS_context->pSettings->xVSS.outputAudioSamplFreq ) - { - case M4VIDEOEDITING_k8000_ASF: - samplingFreq = 8000; - break; - - case M4VIDEOEDITING_k16000_ASF: - samplingFreq = 16000; - break; - - case M4VIDEOEDITING_k22050_ASF: - samplingFreq = 22050; - break; - - case M4VIDEOEDITING_k24000_ASF: - samplingFreq = 24000; - break; - - case M4VIDEOEDITING_k32000_ASF: - samplingFreq = 32000; - break; - - case M4VIDEOEDITING_k44100_ASF: - samplingFreq = 44100; - break; - - case M4VIDEOEDITING_k48000_ASF: - samplingFreq = 48000; - break; - - case M4VIDEOEDITING_kDefault_ASF: - default: - if( xVSS_context->pSettings->xVSS.outputAudioFormat - == M4VIDEOEDITING_kAMR_NB ) - { - samplingFreq = 8000; - } - else if( xVSS_context->pSettings->xVSS.outputAudioFormat - == M4VIDEOEDITING_kAAC ) - { - samplingFreq = 16000; - } - else - { - samplingFreq = 0; - } - break; - } - - /* Allocate clip/transitions if clip number is not null ... */ - if( 0 < xVSS_context->pSettings->uiClipNumber ) - { - if( xVSS_context->pSettings->pClipList != M4OSA_NULL ) - { - free((xVSS_context->pSettings->pClipList)); - xVSS_context->pSettings->pClipList = M4OSA_NULL; - } - - if( xVSS_context->pSettings->pTransitionList != M4OSA_NULL ) - { - free(xVSS_context->pSettings->pTransitionList); - xVSS_context->pSettings->pTransitionList = M4OSA_NULL; - } - - xVSS_context->pSettings->pClipList = - (M4VSS3GPP_ClipSettings ** )M4OSA_32bitAlignedMalloc \ - (sizeof(M4VSS3GPP_ClipSettings *)*xVSS_context->pSettings->uiClipNumber, - M4VS, (M4OSA_Char *)"xVSS, copy of pClipList"); - - if( xVSS_context->pSettings->pClipList == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - /* Set clip list to NULL */ - memset((void *)xVSS_context->pSettings->pClipList,0, - sizeof(M4VSS3GPP_ClipSettings *) - *xVSS_context->pSettings->uiClipNumber); - - if( xVSS_context->pSettings->uiClipNumber > 1 ) - { - xVSS_context->pSettings->pTransitionList = - (M4VSS3GPP_TransitionSettings ** ) \ - M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_TransitionSettings *) \ - *(xVSS_context->pSettings->uiClipNumber - 1), M4VS, (M4OSA_Char *) \ - "xVSS, copy of pTransitionList"); - - if( xVSS_context->pSettings->pTransitionList == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - /* Set transition list to NULL */ - memset( - (void *)xVSS_context->pSettings->pTransitionList,0, - sizeof(M4VSS3GPP_TransitionSettings *) - *(xVSS_context->pSettings->uiClipNumber - 1)); - } - else - { - xVSS_context->pSettings->pTransitionList = M4OSA_NULL; - } - } - /* else, there is a pb in the input settings structure */ - else - { - M4OSA_TRACE1_0("No clip in this settings list !!"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_PARAMETER; - } - - /* RC Allocate effects settings */ - xVSS_context->pSettings->nbEffects = pSettings->nbEffects; - - if( 0 < xVSS_context->pSettings->nbEffects ) - { - xVSS_context->pSettings->Effects = - (M4VSS3GPP_EffectSettings *)M4OSA_32bitAlignedMalloc \ - (xVSS_context->pSettings->nbEffects * sizeof(M4VSS3GPP_EffectSettings), - M4VS, (M4OSA_Char *)"effects settings"); - - if( xVSS_context->pSettings->Effects == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - /*FB bug fix 19.03.2008: these pointers were not initialized -> crash when free*/ - for ( i = 0; i < xVSS_context->pSettings->nbEffects; i++ ) - { - xVSS_context->pSettings->Effects[i].xVSS.pFramingFilePath = - M4OSA_NULL; - xVSS_context->pSettings->Effects[i].xVSS.pFramingBuffer = - M4OSA_NULL; - xVSS_context->pSettings->Effects[i].xVSS.pTextBuffer = M4OSA_NULL; - } - /**/ - } - - if( xVSS_context->targetedTimescale == 0 ) - { - M4OSA_UInt32 pTargetedTimeScale = 0; - - err = M4xVSS_internalGetTargetedTimeScale(xVSS_context, pSettings, - &pTargetedTimeScale); - - if( M4NO_ERROR != err || pTargetedTimeScale == 0 ) - { - M4OSA_TRACE1_1("M4xVSS_SendCommand: M4xVSS_internalGetTargetedTimeScale\ - returned 0x%x", err); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return err; - } - xVSS_context->targetedTimescale = pTargetedTimeScale; - } - - /* Initialize total duration variable */ - totalDuration = 0; - - /* Parsing list of clips given by application, and prepare analyzing */ - for ( i = 0; i < xVSS_context->pSettings->uiClipNumber; i++ ) - { - /* Allocate current clip */ - xVSS_context->pSettings->pClipList[i] = - (M4VSS3GPP_ClipSettings *)M4OSA_32bitAlignedMalloc \ - (sizeof(M4VSS3GPP_ClipSettings), M4VS, (M4OSA_Char *)"clip settings"); - - if( xVSS_context->pSettings->pClipList[i] == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - - /* Copy clip settings from given structure to our xVSS_context structure */ - err = - M4xVSS_DuplicateClipSettings(xVSS_context->pSettings->pClipList[i], - pSettings->pClipList[i], M4OSA_TRUE); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: M4xVSS_DuplicateClipSettings return error 0x%x", - err); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return err; - } - - xVSS_context->pSettings->pClipList[i]->bTranscodingRequired = - M4OSA_FALSE; - - /* Because there is 1 less transition than clip number */ - if( i < xVSS_context->pSettings->uiClipNumber - 1 ) - { - xVSS_context->pSettings->pTransitionList[i] = - (M4VSS3GPP_TransitionSettings - *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_TransitionSettings), - M4VS, (M4OSA_Char *)"transition settings"); - - if( xVSS_context->pSettings->pTransitionList[i] == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - - memcpy( - (void *)xVSS_context->pSettings->pTransitionList[i], - (void *)pSettings->pTransitionList[i], - sizeof(M4VSS3GPP_TransitionSettings)); - /* Initialize external effect context to NULL, to know if input jpg has already been - decoded or not */ - xVSS_context->pSettings->pTransitionList[i]-> - pExtVideoTransitionFctCtxt = M4OSA_NULL; - - switch( xVSS_context->pSettings-> - pTransitionList[i]->VideoTransitionType ) - { - /* If transition type is alpha magic, we need to decode input file */ - case M4xVSS_kVideoTransitionType_AlphaMagic: - /* Allocate our alpha magic settings structure to have a copy of the - provided one */ - xVSS_context->pSettings->pTransitionList[i]-> \ - xVSS.transitionSpecific.pAlphaMagicSettings = - (M4xVSS_AlphaMagicSettings *)M4OSA_32bitAlignedMalloc \ - (sizeof(M4xVSS_AlphaMagicSettings), M4VS, - (M4OSA_Char *)"Input Alpha magic settings structure"); - - if( xVSS_context->pSettings->pTransitionList[i]-> \ - xVSS.transitionSpecific.pAlphaMagicSettings == M4OSA_NULL ) - { - M4OSA_TRACE1_0( - "Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - /* Copy data from the provided alpha magic settings structure tou our - structure */ - memcpy((void *)xVSS_context->pSettings-> - pTransitionList[i]-> \ - xVSS.transitionSpecific.pAlphaMagicSettings, - (void *)pSettings->pTransitionList[i]-> \ - xVSS.transitionSpecific.pAlphaMagicSettings, - sizeof(M4xVSS_AlphaMagicSettings)); - - /* Allocate our alpha magic input filename */ - xVSS_context->pSettings->pTransitionList[i]-> \ - xVSS.transitionSpecific.pAlphaMagicSettings-> - pAlphaFilePath = M4OSA_32bitAlignedMalloc( - (strlen(pSettings->pTransitionList[i]-> \ - xVSS.transitionSpecific.pAlphaMagicSettings->pAlphaFilePath) - + 1), M4VS, (M4OSA_Char *)"Alpha magic file path"); - - if( xVSS_context->pSettings->pTransitionList[i]-> \ - xVSS.transitionSpecific.pAlphaMagicSettings->pAlphaFilePath - == M4OSA_NULL ) - { - M4OSA_TRACE1_0( - "Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - /* Copy data from the provided alpha magic filename to our */ - M4OSA_chrNCopy( - xVSS_context->pSettings->pTransitionList[i]->xVSS. - transitionSpecific.pAlphaMagicSettings-> - pAlphaFilePath, - pSettings->pTransitionList[i]->xVSS. - transitionSpecific.pAlphaMagicSettings-> - pAlphaFilePath, strlen( - pSettings->pTransitionList[i]->xVSS. - transitionSpecific.pAlphaMagicSettings-> - pAlphaFilePath) + 1); - - /* Parse all transition to know if the input jpg has already been decoded */ - for ( j = 0; j < i; j++ ) - { - if( xVSS_context->pSettings-> - pTransitionList[j]->VideoTransitionType - == M4xVSS_kVideoTransitionType_AlphaMagic ) - { - M4OSA_UInt32 pCmpResult = 0; - pCmpResult = strcmp((const char *)xVSS_context->pSettings-> - pTransitionList[i]->xVSS. - transitionSpecific.pAlphaMagicSettings-> - pAlphaFilePath, (const char *)xVSS_context->pSettings-> - pTransitionList[j]->xVSS. - transitionSpecific. - pAlphaMagicSettings->pAlphaFilePath); - - if( pCmpResult == 0 ) - { - M4xVSS_internal_AlphaMagicSettings - *alphaSettings; - - alphaSettings = - (M4xVSS_internal_AlphaMagicSettings - *)M4OSA_32bitAlignedMalloc( - sizeof( - M4xVSS_internal_AlphaMagicSettings), - M4VS, - (M4OSA_Char - *) - "Alpha magic settings structure 1"); - - if( alphaSettings == M4OSA_NULL ) - { - M4OSA_TRACE1_0( - "Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send - command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - alphaSettings->pPlane = - ((M4xVSS_internal_AlphaMagicSettings *)( - xVSS_context->pSettings-> - pTransitionList[j]-> - pExtVideoTransitionFctCtxt))-> - pPlane; - - if( xVSS_context->pSettings-> - pTransitionList[i]->xVSS.transitionSpecific. - pAlphaMagicSettings->blendingPercent > 0 - && xVSS_context->pSettings-> - pTransitionList[i]->xVSS. - transitionSpecific. - pAlphaMagicSettings->blendingPercent - <= 100 ) - { - alphaSettings->blendingthreshold = - ( xVSS_context->pSettings-> - pTransitionList[i]->xVSS. - transitionSpecific. - pAlphaMagicSettings-> - blendingPercent) * 255 / 200; - } - else - { - alphaSettings->blendingthreshold = 0; - } - alphaSettings->isreverse = - xVSS_context->pSettings-> - pTransitionList[i]->xVSS. - transitionSpecific. - pAlphaMagicSettings->isreverse; - /* It means that the input jpg file for alpha magic has already - been decoded -> no nedd to decode it again */ - if( alphaSettings->blendingthreshold == 0 ) - { - xVSS_context->pSettings-> - pTransitionList[i]-> - ExtVideoTransitionFct = - M4xVSS_AlphaMagic; - } - else - { - xVSS_context->pSettings-> - pTransitionList[i]-> - ExtVideoTransitionFct = - M4xVSS_AlphaMagicBlending; - } - xVSS_context->pSettings->pTransitionList[i]-> - pExtVideoTransitionFctCtxt = alphaSettings; - break; - } - } - } - - /* If the jpg has not been decoded yet ... */ - if( xVSS_context->pSettings-> - pTransitionList[i]->pExtVideoTransitionFctCtxt - == M4OSA_NULL ) - { - M4VIFI_ImagePlane *outputPlane; - M4xVSS_internal_AlphaMagicSettings *alphaSettings; - /*UTF conversion support*/ - M4OSA_Void *pDecodedPath = M4OSA_NULL; - - /*To support ARGB8888 : get the width and height */ - M4OSA_UInt32 width_ARGB888 = - xVSS_context->pSettings->pTransitionList[i]->xVSS. - transitionSpecific.pAlphaMagicSettings->width; - M4OSA_UInt32 height_ARGB888 = - xVSS_context->pSettings->pTransitionList[i]->xVSS. - transitionSpecific.pAlphaMagicSettings->height; - M4OSA_TRACE1_1( - " TransitionListM4xVSS_SendCommand width State is %d", - width_ARGB888); - M4OSA_TRACE1_1( - " TransitionListM4xVSS_SendCommand height! State is %d", - height_ARGB888); - /* Allocate output plane */ - outputPlane = (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(3 - * sizeof(M4VIFI_ImagePlane), M4VS, (M4OSA_Char - *) - "Output plane for Alpha magic transition"); - - if( outputPlane == M4OSA_NULL ) - { - M4OSA_TRACE1_0( - "Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - - outputPlane[0].u_width = width; - outputPlane[0].u_height = height; - outputPlane[0].u_topleft = 0; - outputPlane[0].u_stride = width; - outputPlane[0].pac_data = (M4VIFI_UInt8 - *)M4OSA_32bitAlignedMalloc(( width * height * 3) - >> 1, - M4VS, - (M4OSA_Char - *) - "Alloc for the Alpha magic pac_data output YUV"); - ; - - if( outputPlane[0].pac_data == M4OSA_NULL ) - { - free(outputPlane); - outputPlane = M4OSA_NULL; - M4OSA_TRACE1_0( - "Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - outputPlane[1].u_width = width >> 1; - outputPlane[1].u_height = height >> 1; - outputPlane[1].u_topleft = 0; - outputPlane[1].u_stride = width >> 1; - outputPlane[1].pac_data = outputPlane[0].pac_data - + outputPlane[0].u_width * outputPlane[0].u_height; - outputPlane[2].u_width = width >> 1; - outputPlane[2].u_height = height >> 1; - outputPlane[2].u_topleft = 0; - outputPlane[2].u_stride = width >> 1; - outputPlane[2].pac_data = outputPlane[1].pac_data - + outputPlane[1].u_width * outputPlane[1].u_height; - - pDecodedPath = - xVSS_context->pSettings->pTransitionList[i]->xVSS. - transitionSpecific.pAlphaMagicSettings-> - pAlphaFilePath; - /** - * UTF conversion: convert into the customer format, before being used*/ - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext. - pTempOutConversionBuffer != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)xVSS_context->pSettings-> - pTransitionList[i]->xVSS. - transitionSpecific. - pAlphaMagicSettings->pAlphaFilePath, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext. - pTempOutConversionBuffer, &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: pConvFromUTF8Fct returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext. - pTempOutConversionBuffer; - } - /** - End of the conversion, use the decoded path*/ - /*To support ARGB8888 : convert + resizing from ARGB8888 to yuv420 */ - - err = M4xVSS_internalConvertAndResizeARGB8888toYUV420( - pDecodedPath, - xVSS_context->pFileReadPtr, outputPlane, - width_ARGB888, height_ARGB888); - - if( err != M4NO_ERROR ) - { - free(outputPlane[0].pac_data); - outputPlane[0].pac_data = M4OSA_NULL; - free(outputPlane); - outputPlane = M4OSA_NULL; - M4xVSS_freeCommand(xVSS_context); - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: error when decoding alpha magic JPEG: 0x%x", - err); - return err; - } - - /* Allocate alpha settings structure */ - alphaSettings = - (M4xVSS_internal_AlphaMagicSettings *)M4OSA_32bitAlignedMalloc( - sizeof(M4xVSS_internal_AlphaMagicSettings), - M4VS, (M4OSA_Char - *)"Alpha magic settings structure 2"); - - if( alphaSettings == M4OSA_NULL ) - { - M4OSA_TRACE1_0( - "Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - alphaSettings->pPlane = outputPlane; - - if( xVSS_context->pSettings->pTransitionList[i]->xVSS. - transitionSpecific.pAlphaMagicSettings-> - blendingPercent > 0 && xVSS_context->pSettings-> - pTransitionList[i]->xVSS. - transitionSpecific.pAlphaMagicSettings-> - blendingPercent <= 100 ) - { - alphaSettings->blendingthreshold = - ( xVSS_context->pSettings-> - pTransitionList[i]->xVSS. - transitionSpecific.pAlphaMagicSettings-> - blendingPercent) * 255 / 200; - } - else - { - alphaSettings->blendingthreshold = 0; - } - alphaSettings->isreverse = - xVSS_context->pSettings->pTransitionList[i]->xVSS. - transitionSpecific.pAlphaMagicSettings-> - isreverse; - - if( alphaSettings->blendingthreshold == 0 ) - { - xVSS_context->pSettings->pTransitionList[i]-> - ExtVideoTransitionFct = M4xVSS_AlphaMagic; - } - else - { - xVSS_context->pSettings->pTransitionList[i]-> - ExtVideoTransitionFct = - M4xVSS_AlphaMagicBlending; - } - xVSS_context->pSettings->pTransitionList[i]-> - pExtVideoTransitionFctCtxt = alphaSettings; - } - - break; - - case M4xVSS_kVideoTransitionType_SlideTransition: - { - M4xVSS_internal_SlideTransitionSettings *slideSettings; - slideSettings = - (M4xVSS_internal_SlideTransitionSettings *)M4OSA_32bitAlignedMalloc( - sizeof(M4xVSS_internal_SlideTransitionSettings), - M4VS, (M4OSA_Char - *)"Internal slide transition settings"); - - if( M4OSA_NULL == slideSettings ) - { - M4OSA_TRACE1_0( - "Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - /* Just copy the lone parameter from the input settings to the internal - context. */ - - slideSettings->direction = - pSettings->pTransitionList[i]->xVSS.transitionSpecific. - pSlideTransitionSettings->direction; - - /* No need to keep our copy of the settings. */ - xVSS_context->pSettings->pTransitionList[i]-> - xVSS.transitionSpecific.pSlideTransitionSettings = - M4OSA_NULL; - xVSS_context->pSettings->pTransitionList[i]-> - ExtVideoTransitionFct = &M4xVSS_SlideTransition; - xVSS_context->pSettings->pTransitionList[i]-> - pExtVideoTransitionFctCtxt = slideSettings; - } - break; - - case M4xVSS_kVideoTransitionType_FadeBlack: - { - xVSS_context->pSettings->pTransitionList[i]-> - ExtVideoTransitionFct = &M4xVSS_FadeBlackTransition; - } - break; - - case M4xVSS_kVideoTransitionType_External: - { - xVSS_context->pSettings->pTransitionList[i]-> - ExtVideoTransitionFct = - pSettings->pTransitionList[i]->ExtVideoTransitionFct; - xVSS_context->pSettings->pTransitionList[i]-> - pExtVideoTransitionFctCtxt = - pSettings->pTransitionList[i]-> - pExtVideoTransitionFctCtxt; - xVSS_context->pSettings->pTransitionList[i]-> - VideoTransitionType = - M4VSS3GPP_kVideoTransitionType_External; - } - break; - - default: - break; - } // switch - - /* Update total_duration with transition duration */ - totalDuration -= xVSS_context->pSettings-> - pTransitionList[i]->uiTransitionDuration; - } - - - if( xVSS_context->pSettings->pClipList[i]->FileType - == M4VIDEOEDITING_kFileType_ARGB8888 ) - { - if(M4OSA_TRUE == - xVSS_context->pSettings->pClipList[i]->xVSS.isPanZoom) { - M4OSA_Char out_img[M4XVSS_MAX_PATH_LEN]; - M4OSA_Char out_img_tmp[M4XVSS_MAX_PATH_LEN]; - M4xVSS_Pto3GPP_params *pParams = M4OSA_NULL; - M4OSA_Context pARGBFileIn; - /*UTF conversion support*/ - M4OSA_Void *pDecodedPath = pSettings->pClipList[i]->pFile; - - /* Parse Pto3GPP params chained list to know if input file has already been - converted */ - if( xVSS_context->pPTo3GPPparamsList != M4OSA_NULL ) - { - M4OSA_UInt32 pCmpResult = 0; - - pParams = xVSS_context->pPTo3GPPparamsList; - /* We parse all Pto3gpp Param chained list */ - while( pParams != M4OSA_NULL ) - { - pCmpResult = strcmp((const char *)pSettings->pClipList[i]->pFile, - (const char *)pParams->pFileIn); - - if( pCmpResult == 0 - && (pSettings->pClipList[i]->uiEndCutTime - == pParams->duration - || pSettings->pClipList[i]->xVSS.uiDuration - == pParams->duration) - && pSettings->pClipList[i]->xVSS.MediaRendering - == pParams->MediaRendering ) - - - - { - /* Replace JPG filename with existing 3GP filename */ - goto replaceARGB_3GP; - } - /* We need to update this variable, in case some pictures have been - added between two */ - /* calls to M4xVSS_sendCommand */ - pPto3GPP_last = pParams; - pParams = pParams->pNext; - } - } - - /* Construct output temporary 3GP filename */ - err = M4OSA_chrSPrintf(out_img, M4XVSS_MAX_PATH_LEN - 1, (M4OSA_Char *)"%simg%d.3gp", - xVSS_context->pTempPath, xVSS_context->tempFileIndex); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1("Error in M4OSA_chrSPrintf: 0x%x", err); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return err; - } - - #ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE - - err = M4OSA_chrSPrintf(out_img_tmp, M4XVSS_MAX_PATH_LEN - 1, "%simg%d.tmp", - xVSS_context->pTempPath, xVSS_context->tempFileIndex); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1("Error in M4OSA_chrSPrintf: 0x%x", err); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return err; - } - - #endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/ - - xVSS_context->tempFileIndex++; - - /* Allocate last element Pto3GPP params structure */ - pParams = (M4xVSS_Pto3GPP_params - *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_Pto3GPP_params), - M4VS, (M4OSA_Char *)"Element of Pto3GPP Params"); - - if( pParams == M4OSA_NULL ) - { - M4OSA_TRACE1_0( - "M4xVSS_sendCommand: Problem when allocating one element Pto3GPP Params"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - - /* Initializes pfilexxx members of pParams to be able to free them correctly */ - pParams->pFileIn = M4OSA_NULL; - pParams->pFileOut = M4OSA_NULL; - pParams->pFileTemp = M4OSA_NULL; - pParams->pNext = M4OSA_NULL; - pParams->MediaRendering = M4xVSS_kResizing; - - /*To support ARGB8888 :get the width and height */ - pParams->height = pSettings->pClipList[ - i]->ClipProperties.uiStillPicHeight; //ARGB_Height; - pParams->width = pSettings->pClipList[ - i]->ClipProperties.uiStillPicWidth; //ARGB_Width; - M4OSA_TRACE3_1("CLIP M4xVSS_SendCommand ARGB8888 H = %d", pParams->height); - M4OSA_TRACE3_1("CLIP M4xVSS_SendCommand ARGB8888 W = %d", pParams->width); - - if( xVSS_context->pPTo3GPPparamsList - == M4OSA_NULL ) /* Means it is the first element of the list */ - { - /* Initialize the xVSS context with the first element of the list */ - xVSS_context->pPTo3GPPparamsList = pParams; - - /* Save this element in case of other file to convert */ - pPto3GPP_last = pParams; - } - else - { - /* Update next pointer of the previous last element of the chain */ - pPto3GPP_last->pNext = pParams; - - /* Update save of last element of the chain */ - pPto3GPP_last = pParams; - } - - /* Fill the last M4xVSS_Pto3GPP_params element */ - pParams->duration = - xVSS_context->pSettings->pClipList[i]->uiEndCutTime; - /* If duration is filled, let's use it instead of EndCutTime */ - if( xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration != 0 ) - { - pParams->duration = - xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration; - } - - pParams->InputFileType = M4VIDEOEDITING_kFileType_ARGB8888; - - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = xVSS_context->pSettings->pClipList[i]->pFile; - length = strlen(pDecodedPath); - - /** - * UTF conversion: convert into the customer format, before being used*/ - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void - *)xVSS_context->pSettings->pClipList[i]->pFile, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, - &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: pConvFromUTF8Fct returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the UTF conversion, use the converted file path*/ - pParams->pFileIn = (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS, - (M4OSA_Char *)"Pto3GPP Params: file in"); - - if( pParams->pFileIn == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - memcpy((void *)pParams->pFileIn, (void *)pDecodedPath, - (length + 1)); /* Copy input file path */ - - /* Check that JPG file is present on the FS (P4ME00002974) by just opening - and closing it */ - err = - xVSS_context->pFileReadPtr->openRead(&pARGBFileIn, pDecodedPath, - M4OSA_kFileRead); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_2("Can't open input jpg file %s, error: 0x%x\n", - pDecodedPath, err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - err = xVSS_context->pFileReadPtr->closeRead(pARGBFileIn); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_2("Can't close input jpg file %s, error: 0x%x\n", - pDecodedPath, err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = out_img; - length = strlen(pDecodedPath); - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)out_img, (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: pConvFromUTF8Fct returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the UTF conversion, use the converted file path*/ - pParams->pFileOut = (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS, - (M4OSA_Char *)"Pto3GPP Params: file out"); - - if( pParams->pFileOut == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - memcpy((void *)pParams->pFileOut, (void *)pDecodedPath, - (length + 1)); /* Copy output file path */ - - #ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE - /** - * UTF conversion: convert into the customer format, before being used*/ - - pDecodedPath = out_img_tmp; - length = strlen(pDecodedPath); - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)out_img_tmp, (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1("M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8\ - returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the UTF conversion, use the converted file path*/ - pParams->pFileTemp = (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS, - (M4OSA_Char *)"Pto3GPP Params: file temp"); - - if( pParams->pFileTemp == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - memcpy((void *)pParams->pFileTemp, (void *)pDecodedPath, - (length + 1)); /* Copy temporary file path */ - - #endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/ - - /* Fill PanAndZoom settings if needed */ - - if( M4OSA_TRUE - == xVSS_context->pSettings->pClipList[i]->xVSS.isPanZoom ) - { - pParams->isPanZoom = - xVSS_context->pSettings->pClipList[i]->xVSS.isPanZoom; - /* Check that Pan & Zoom parameters are corrects */ - if( xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXa > 1000 - || xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXa - <= 0 || xVSS_context->pSettings->pClipList[i]->xVSS. - PanZoomTopleftXa > 1000 - || xVSS_context->pSettings->pClipList[i]->xVSS. - PanZoomTopleftYa > 1000 - || xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXb - > 1000 - || xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXb - <= 0 || xVSS_context->pSettings->pClipList[i]->xVSS. - PanZoomTopleftXb > 1000 - || xVSS_context->pSettings->pClipList[i]->xVSS. - PanZoomTopleftYb > 1000) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - M4xVSS_freeCommand(xVSS_context); - return M4ERR_PARAMETER; - } - - pParams->PanZoomXa = - xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXa; - pParams->PanZoomTopleftXa = - xVSS_context->pSettings-> - pClipList[i]->xVSS.PanZoomTopleftXa; - pParams->PanZoomTopleftYa = - xVSS_context->pSettings-> - pClipList[i]->xVSS.PanZoomTopleftYa; - pParams->PanZoomXb = - xVSS_context->pSettings->pClipList[i]->xVSS.PanZoomXb; - pParams->PanZoomTopleftXb = - xVSS_context->pSettings-> - pClipList[i]->xVSS.PanZoomTopleftXb; - pParams->PanZoomTopleftYb = - xVSS_context->pSettings-> - pClipList[i]->xVSS.PanZoomTopleftYb; - } - else - { - pParams->isPanZoom = M4OSA_FALSE; - } - /*+ PR No: blrnxpsw#223*/ - /*Intializing the Video Frame Rate as it may not be intialized*/ - /*Other changes made is @ M4xVSS_Internal.c @ line 1518 in - M4xVSS_internalStartConvertPictureTo3gp*/ - switch( xVSS_context->pSettings->videoFrameRate ) - { - case M4VIDEOEDITING_k30_FPS: - pParams->framerate = 33; - break; - - case M4VIDEOEDITING_k25_FPS: - pParams->framerate = 40; - break; - - case M4VIDEOEDITING_k20_FPS: - pParams->framerate = 50; - break; - - case M4VIDEOEDITING_k15_FPS: - pParams->framerate = 66; - break; - - case M4VIDEOEDITING_k12_5_FPS: - pParams->framerate = 80; - break; - - case M4VIDEOEDITING_k10_FPS: - pParams->framerate = 100; - break; - - case M4VIDEOEDITING_k7_5_FPS: - pParams->framerate = 133; - break; - - case M4VIDEOEDITING_k5_FPS: - pParams->framerate = 200; - break; - - default: - /*Making Default Frame Rate @ 15 FPS*/ - pParams->framerate = 66; - break; - } - /*-PR No: blrnxpsw#223*/ - if( xVSS_context->pSettings->pClipList[i]->xVSS.MediaRendering - == M4xVSS_kCropping - || xVSS_context->pSettings->pClipList[i]->xVSS. - MediaRendering == M4xVSS_kBlackBorders - || xVSS_context->pSettings->pClipList[i]->xVSS. - MediaRendering == M4xVSS_kResizing ) - { - pParams->MediaRendering = - xVSS_context->pSettings->pClipList[i]->xVSS.MediaRendering; - } - - pParams->pNext = M4OSA_NULL; - pParams->isCreated = M4OSA_FALSE; - xVSS_context->nbStepTotal++; - /* Set bTranscodingRequired to TRUE to indicate the kenburn video has - * been generated in analysis phase, and does not need to be tanscoded again - * in saving phase */ - xVSS_context->pSettings->pClipList[i]->bTranscodingRequired = - M4OSA_TRUE; - - replaceARGB_3GP: - /* Update total duration */ - totalDuration += pParams->duration; - - /* Replacing in VSS structure the JPG file by the 3gp file */ - xVSS_context->pSettings->pClipList[i]->FileType = - M4VIDEOEDITING_kFileType_3GPP; - - if( xVSS_context->pSettings->pClipList[i]->pFile != M4OSA_NULL ) - { - free(xVSS_context->pSettings->pClipList[i]->pFile); - xVSS_context->pSettings->pClipList[i]->pFile = M4OSA_NULL; - } - - /** - * UTF conversion: convert into UTF8, before being used*/ - pDecodedPath = pParams->pFileOut; - - if( xVSS_context->UTFConversionContext.pConvToUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertToUTF8(xVSS_context, - (M4OSA_Void *)pParams->pFileOut, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, - &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: M4xVSS_internalConvertToUTF8 returns err: \ - 0x%x",err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - else - { - length = strlen(pDecodedPath); - } - /** - * End of the UTF conversion, use the converted file path*/ - xVSS_context->pSettings->pClipList[i]->pFile = M4OSA_32bitAlignedMalloc((length - + 1), M4VS, (M4OSA_Char *)"xVSS file path of ARGB to 3gp"); - - if( xVSS_context->pSettings->pClipList[i]->pFile == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - memcpy((void *)xVSS_context->pSettings->pClipList[i]->pFile, - (void *)pDecodedPath, (length + 1)); - /*FB: add file path size because of UTF16 conversion*/ - xVSS_context->pSettings->pClipList[i]->filePathSize = length+1; - } - } - /************************ - 3GP input file type case - *************************/ - else if( xVSS_context->pSettings->pClipList[i]->FileType - == M4VIDEOEDITING_kFileType_3GPP - || xVSS_context->pSettings->pClipList[i]->FileType - == M4VIDEOEDITING_kFileType_MP4 - || xVSS_context->pSettings->pClipList[i]->FileType - == M4VIDEOEDITING_kFileType_M4V ) - { - /*UTF conversion support*/ - M4OSA_Void *pDecodedPath = M4OSA_NULL; - - /* Need to call MCS in case 3GP video/audio types are not compatible - (H263/MPEG4 or AMRNB/AAC) */ - /* => Need to fill MCS_Params structure with the right parameters ! */ - /* Need also to parse MCS params struct to check if file has already been transcoded */ - - M4VIDEOEDITING_ClipProperties fileProperties; - M4xVSS_MCS_params *pParams; - M4OSA_Bool audioIsDifferent = M4OSA_FALSE; - M4OSA_Bool videoIsDifferent = M4OSA_FALSE; - M4OSA_Bool bAudioMono; - /* Initialize file properties structure */ - - memset((void *) &fileProperties,0, - sizeof(M4VIDEOEDITING_ClipProperties)); - - //fileProperties.AudioStreamType = M4VIDEOEDITING_kNoneAudio; - - /* Prevent from bad initializing of percentage cut time */ - if( xVSS_context->pSettings->pClipList[i]->xVSS.uiEndCutPercent - > 100 || xVSS_context->pSettings->pClipList[i]->xVSS. - uiBeginCutPercent > 100 ) - { - /* These percentage cut time have probably not been initialized */ - /* Let's not use them by setting them to 0 */ - xVSS_context->pSettings->pClipList[i]->xVSS.uiEndCutPercent = 0; - xVSS_context->pSettings->pClipList[i]->xVSS.uiBeginCutPercent = - 0; - } - - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = xVSS_context->pSettings->pClipList[i]->pFile; - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void - *)xVSS_context->pSettings->pClipList[i]->pFile, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, - &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - /** - * End of the UTF conversion, use the converted file path*/ - err = M4xVSS_internalGetProperties(xVSS_context, pDecodedPath, - &fileProperties); - - if( err != M4NO_ERROR ) - { - M4xVSS_freeCommand(xVSS_context); - M4OSA_TRACE1_1( - "M4xVSS_sendCommand: M4xVSS_internalGetProperties returned 0x%x", - err); - /* TODO: Translate error code of MCS to an xVSS error code */ - return err; - } - - /* Parse MCS params chained list to know if input file has already been converted */ - if( xVSS_context->pMCSparamsList != M4OSA_NULL ) - { - M4OSA_UInt32 pCmpResult = 0; - - pParams = xVSS_context->pMCSparamsList; - /* We parse all MCS Param chained list */ - while( pParams != M4OSA_NULL ) - { - - /** - * UTF conversion: convert into UTF8, before being used*/ - pDecodedPath = pParams->pFileIn; - - if( xVSS_context->UTFConversionContext.pConvToUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertToUTF8(xVSS_context, - (M4OSA_Void *)pParams->pFileIn, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext. - pTempOutConversionBuffer, &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: M4xVSS_internalConvertToUTF8 returns err:\ - 0x%x", err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the UTF conversion, use the converted file path*/ - pCmpResult = strcmp((const char *)pSettings->pClipList[i]->pFile, - (const char *)pDecodedPath); - - /* If input filenames are the same, and if this is not a BGM, we can reuse - the transcoded file */ - if( pCmpResult == 0 && pParams->isBGM == M4OSA_FALSE - && pParams->BeginCutTime - == pSettings->pClipList[i]->uiBeginCutTime - && (pParams->EndCutTime - == pSettings->pClipList[i]->uiEndCutTime - || pParams->EndCutTime - == pSettings->pClipList[i]->uiBeginCutTime - + pSettings->pClipList[i]->xVSS.uiDuration) - && pSettings->pClipList[i]->xVSS.MediaRendering - == pParams->MediaRendering ) - { - if( pSettings->xVSS.pBGMtrack != M4OSA_NULL ) - { - if( pSettings->xVSS.pBGMtrack->uiAddVolume == 100 - || (pParams->OutputAudioFormat - == M4VIDEOEDITING_kNullAudio - && fileProperties.AudioStreamType - == pSettings->xVSS.outputAudioFormat) - || pParams->OutputAudioFormat - == pSettings->xVSS.outputAudioFormat - || fileProperties.AudioStreamType - == M4VIDEOEDITING_kNoneAudio ) - { - /* Replace 3GP filename with transcoded 3GP filename */ - goto replace3GP_3GP; - } - } - else if( ( pParams->OutputAudioFormat - == M4VIDEOEDITING_kNullAudio - && fileProperties.AudioStreamType - == pSettings->xVSS.outputAudioFormat) - || pParams->OutputAudioFormat - == pSettings->xVSS.outputAudioFormat - || fileProperties.AudioStreamType - == M4VIDEOEDITING_kNoneAudio ) - { - /* Replace 3GP filename with transcoded 3GP filename */ - goto replace3GP_3GP; - } - } - - /* We need to update this variable, in case some 3GP files have been added - between two */ - /* calls to M4xVSS_sendCommand */ - pMCS_last = pParams; - pParams = pParams->pNext; - } - } - - /* If we have percentage information let's use it... */ - if( xVSS_context->pSettings->pClipList[i]->xVSS.uiEndCutPercent != 0 - || xVSS_context->pSettings->pClipList[i]->xVSS.uiBeginCutPercent - != 0 ) - { - /* If percentage information are not correct and if duration field is not filled */ - if( ( xVSS_context->pSettings->pClipList[i]->xVSS. - uiEndCutPercent - <= xVSS_context->pSettings->pClipList[i]->xVSS. - uiBeginCutPercent) - && xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration - == 0 ) - { - M4OSA_TRACE1_0( - "M4xVSS_sendCommand: Bad percentage for begin and end cut time !"); - M4xVSS_freeCommand(xVSS_context); - return M4ERR_PARAMETER; - } - - /* We transform the percentage into absolute time */ - xVSS_context->pSettings->pClipList[i]->uiBeginCutTime - = (M4OSA_UInt32)( - xVSS_context->pSettings->pClipList[i]->xVSS. - uiBeginCutPercent - * fileProperties.uiClipDuration / 100); - xVSS_context->pSettings->pClipList[i]->uiEndCutTime - = (M4OSA_UInt32)( - xVSS_context->pSettings->pClipList[i]->xVSS. - uiEndCutPercent - * fileProperties.uiClipDuration / 100); - } - /* ...Otherwise, we use absolute time. */ - else - { - /* If endCutTime == 0, it means all the file is taken. Let's change to the file - duration, to accurate preview. */ - if( xVSS_context->pSettings->pClipList[i]->uiEndCutTime == 0 - || xVSS_context->pSettings->pClipList[i]->uiEndCutTime - > fileProperties.uiClipDuration ) - { - xVSS_context->pSettings->pClipList[i]->uiEndCutTime = - fileProperties.uiClipDuration; - } - } - - /* If duration field is filled, it has priority on other fields on EndCutTime, - so let's use it */ - if( xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration != 0 ) - { - xVSS_context->pSettings->pClipList[i]->uiEndCutTime = - xVSS_context->pSettings->pClipList[i]->uiBeginCutTime - +xVSS_context->pSettings->pClipList[i]->xVSS.uiDuration; - - if( xVSS_context->pSettings->pClipList[i]->uiEndCutTime - > fileProperties.uiClipDuration ) - { - xVSS_context->pSettings->pClipList[i]->uiEndCutTime = - fileProperties.uiClipDuration; - } - } - - /* If output video format is not set, we take video format of the first 3GP video */ - if( xVSS_context->pSettings->xVSS.outputVideoFormat - == M4VIDEOEDITING_kNoneVideo ) - { - //xVSS_context->pSettings->xVSS.outputVideoFormat = fileProperties.VideoStreamType; - //M4OSA_TRACE2_1("Output video format is not set, set it to current clip: %d", - // xVSS_context->pSettings->xVSS.outputVideoFormat); - M4OSA_TRACE1_0( - "Output video format is not set, an error parameter is returned."); - M4xVSS_freeCommand(xVSS_context); - return M4ERR_PARAMETER; - } - - if( xVSS_context->pSettings->xVSS.outputAudioFormat - == M4VIDEOEDITING_kNoneAudio ) - { - //xVSS_context->pSettings->xVSS.outputAudioFormat = fileProperties.AudioStreamType; - M4OSA_TRACE2_1( - "Output audio format is not set -> remove audio track of clip: %d", - i); - } - - if( fileProperties.uiNbChannels == 1 ) - { - bAudioMono = M4OSA_TRUE; - } - else - { - bAudioMono = M4OSA_FALSE; - } - - if( fileProperties.AudioStreamType - != xVSS_context->pSettings->xVSS.outputAudioFormat - || (fileProperties.AudioStreamType == M4VIDEOEDITING_kAAC - && (fileProperties.uiSamplingFrequency != samplingFreq - || bAudioMono - != xVSS_context->pSettings->xVSS.bAudioMono)) ) - { - audioIsDifferent = M4OSA_TRUE; - /* If we want to replace audio, there is no need to transcode audio */ - if( pSettings->xVSS.pBGMtrack != M4OSA_NULL ) - { - /* temp fix :PT volume not herad in the second clip */ - if( /*(pSettings->xVSS.pBGMtrack->uiAddVolume == 100 - && xVSS_context->pSettings->xVSS.outputFileSize == 0) - ||*/ - fileProperties.AudioStreamType - == M4VIDEOEDITING_kNoneAudio ) /*11/12/2008 CR 3283 VAL for the MMS - use case, we need to transcode except the media without audio*/ - { - audioIsDifferent = M4OSA_FALSE; - } - } - else if( fileProperties.AudioStreamType - == M4VIDEOEDITING_kNoneAudio ) - { - audioIsDifferent = M4OSA_FALSE; - } - } - /* Here check the clip video profile and level, if it exceeds - * the profile and level of export file, then the file needs - * to be transcoded(do not do compress domain trim). - * Also for MPEG4 fomart, always do transcoding since HW encoder - * may use different time scale value than the input clip*/ - if ((fileProperties.uiVideoProfile > - xVSS_context->pSettings->xVSS.outputVideoProfile) || - (fileProperties.uiVideoLevel > - xVSS_context->pSettings->xVSS.outputVideoLevel) || - (fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4)) { - /* Set bTranscodingRequired to TRUE to indicate the video will be - * transcoded in MCS. */ - xVSS_context->pSettings->pClipList[i]->bTranscodingRequired = - M4OSA_TRUE; - videoIsDifferent = M4OSA_TRUE; - } - - if( videoIsDifferent == M4OSA_TRUE || audioIsDifferent == M4OSA_TRUE) - { - M4OSA_Char out_3gp[M4XVSS_MAX_PATH_LEN]; - M4OSA_Char out_3gp_tmp[M4XVSS_MAX_PATH_LEN]; - - /* Construct output temporary 3GP filename */ - err = M4OSA_chrSPrintf(out_3gp, M4XVSS_MAX_PATH_LEN - 1, (M4OSA_Char *)"%svid%d.3gp", - xVSS_context->pTempPath, xVSS_context->tempFileIndex); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1("Error in M4OSA_chrSPrintf: 0x%x", err); - return err; - } - -#ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE - - err = M4OSA_chrSPrintf(out_3gp_tmp, M4XVSS_MAX_PATH_LEN - 1, "%svid%d.tmp", - xVSS_context->pTempPath, xVSS_context->tempFileIndex); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1("Error in M4OSA_chrSPrintf: 0x%x", err); - return err; - } - -#endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/ - - xVSS_context->tempFileIndex++; - - pParams = - (M4xVSS_MCS_params *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_MCS_params), - M4VS, (M4OSA_Char *)"Element of MCS Params (for 3GP)"); - - if( pParams == M4OSA_NULL ) - { - M4OSA_TRACE1_0( - "M4xVSS_sendCommand: Problem when allocating one element MCS Params"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - pParams->MediaRendering = M4xVSS_kResizing; - pParams->videoclipnumber = i; // Indicates video clip index - - if( xVSS_context->pMCSparamsList - == M4OSA_NULL ) /* Means it is the first element of the list */ - { - /* Initialize the xVSS context with the first element of the list */ - xVSS_context->pMCSparamsList = pParams; - } - else - { - /* Update next pointer of the previous last element of the chain */ - pMCS_last->pNext = pParams; - } - - /* Save this element in case of other file to convert */ - pMCS_last = pParams; - - /* Fill the last M4xVSS_MCS_params element */ - pParams->InputFileType = M4VIDEOEDITING_kFileType_3GPP; - pParams->OutputFileType = M4VIDEOEDITING_kFileType_3GPP; - - pParams->OutputVideoTimescale = xVSS_context->targetedTimescale; - - /* We do not need to reencode video if its parameters do not differ */ - /* from output settings parameters */ - if( videoIsDifferent == M4OSA_TRUE ) - { - pParams->OutputVideoFormat = - xVSS_context->pSettings->xVSS.outputVideoFormat; - pParams->outputVideoProfile = - xVSS_context->pSettings->xVSS.outputVideoProfile; - pParams->outputVideoLevel = - xVSS_context->pSettings->xVSS.outputVideoLevel; - pParams->OutputVideoFrameRate = - xVSS_context->pSettings->videoFrameRate; - pParams->OutputVideoFrameSize = - xVSS_context->pSettings->xVSS.outputVideoSize; - - /*FB: VAL CR P4ME00003076 - The output video bitrate is now directly given by the user in the edition - settings structure If the bitrate given by the user is irrelevant - (the MCS minimum and maximum video bitrate are used), - the output video bitrate is hardcoded according to the output video size*/ - if( xVSS_context->pSettings->xVSS.outputVideoBitrate - >= M4VIDEOEDITING_k16_KBPS - && xVSS_context->pSettings->xVSS.outputVideoBitrate - <= M4VIDEOEDITING_k8_MBPS ) /*+ New Encoder bitrates */ - { - pParams->OutputVideoBitrate = - xVSS_context->pSettings->xVSS.outputVideoBitrate; - } - else - { - switch( xVSS_context->pSettings->xVSS.outputVideoSize ) - { - case M4VIDEOEDITING_kSQCIF: - pParams->OutputVideoBitrate = - M4VIDEOEDITING_k48_KBPS; - break; - - case M4VIDEOEDITING_kQQVGA: - pParams->OutputVideoBitrate = - M4VIDEOEDITING_k64_KBPS; - break; - - case M4VIDEOEDITING_kQCIF: - pParams->OutputVideoBitrate = - M4VIDEOEDITING_k128_KBPS; - break; - - case M4VIDEOEDITING_kQVGA: - pParams->OutputVideoBitrate = - M4VIDEOEDITING_k384_KBPS; - break; - - case M4VIDEOEDITING_kCIF: - pParams->OutputVideoBitrate = - M4VIDEOEDITING_k384_KBPS; - break; - - case M4VIDEOEDITING_kVGA: - pParams->OutputVideoBitrate = - M4VIDEOEDITING_k512_KBPS; - break; - - default: /* Should not happen !! */ - pParams->OutputVideoBitrate = - M4VIDEOEDITING_k64_KBPS; - break; - } - } - } - else - { - pParams->outputVideoProfile = - xVSS_context->pSettings->xVSS.outputVideoProfile; - pParams->outputVideoLevel = - xVSS_context->pSettings->xVSS.outputVideoLevel; - pParams->OutputVideoFormat = M4VIDEOEDITING_kNullVideo; - pParams->OutputVideoFrameRate = - M4VIDEOEDITING_k15_FPS; /* Must be set, otherwise, MCS returns an error */ - } - - if( audioIsDifferent == M4OSA_TRUE ) - { - pParams->OutputAudioFormat = - xVSS_context->pSettings->xVSS.outputAudioFormat; - - switch( xVSS_context->pSettings->xVSS.outputAudioFormat ) - { - case M4VIDEOEDITING_kNoneAudio: - break; - - case M4VIDEOEDITING_kAMR_NB: - pParams->OutputAudioBitrate = - M4VIDEOEDITING_k12_2_KBPS; - pParams->bAudioMono = M4OSA_TRUE; - pParams->OutputAudioSamplingFrequency = - M4VIDEOEDITING_kDefault_ASF; - break; - - case M4VIDEOEDITING_kAAC: - { - /*FB: VAL CR P4ME00003076 - The output audio bitrate in the AAC case is now directly given by - the user in the edition settings structure - If the bitrate given by the user is irrelevant or undefined - (the MCS minimum and maximum audio bitrate are used), - the output audio bitrate is hard coded according to the output - audio sampling frequency*/ - - /*Check if the audio bitrate is correctly defined*/ - - /*Mono - MCS values for AAC Mono are min: 16kbps and max: 192 kbps*/ - if( xVSS_context->pSettings->xVSS.outputAudioBitrate - >= M4VIDEOEDITING_k16_KBPS - && xVSS_context->pSettings-> - xVSS.outputAudioBitrate - <= M4VIDEOEDITING_k192_KBPS - && xVSS_context->pSettings->xVSS.bAudioMono - == M4OSA_TRUE ) - { - pParams->OutputAudioBitrate = - xVSS_context->pSettings-> - xVSS.outputAudioBitrate; - } - /*Stereo - MCS values for AAC Mono are min: 32kbps and max: 192 kbps*/ - else if( xVSS_context->pSettings-> - xVSS.outputAudioBitrate - >= M4VIDEOEDITING_k32_KBPS - && xVSS_context->pSettings-> - xVSS.outputAudioBitrate - <= M4VIDEOEDITING_k192_KBPS - && xVSS_context->pSettings->xVSS.bAudioMono - == M4OSA_FALSE ) - { - pParams->OutputAudioBitrate = - xVSS_context->pSettings-> - xVSS.outputAudioBitrate; - } - - /*The audio bitrate is hard coded according to the output audio - sampling frequency*/ - else - { - switch( xVSS_context->pSettings-> - xVSS.outputAudioSamplFreq ) - { - case M4VIDEOEDITING_k16000_ASF: - pParams->OutputAudioBitrate = - M4VIDEOEDITING_k24_KBPS; - break; - - case M4VIDEOEDITING_k22050_ASF: - case M4VIDEOEDITING_k24000_ASF: - pParams->OutputAudioBitrate = - M4VIDEOEDITING_k32_KBPS; - break; - - case M4VIDEOEDITING_k32000_ASF: - pParams->OutputAudioBitrate = - M4VIDEOEDITING_k48_KBPS; - break; - - case M4VIDEOEDITING_k44100_ASF: - case M4VIDEOEDITING_k48000_ASF: - pParams->OutputAudioBitrate = - M4VIDEOEDITING_k64_KBPS; - break; - - default: - pParams->OutputAudioBitrate = - M4VIDEOEDITING_k64_KBPS; - break; - } - - if( xVSS_context->pSettings->xVSS.bAudioMono - == M4OSA_FALSE ) - { - /* Output bitrate have to be doubled */ - pParams->OutputAudioBitrate += - pParams->OutputAudioBitrate; - } - } - - pParams->bAudioMono = - xVSS_context->pSettings->xVSS.bAudioMono; - - if( xVSS_context->pSettings-> - xVSS.outputAudioSamplFreq - == M4VIDEOEDITING_k8000_ASF ) - { - /* Prevent from unallowed sampling frequencies */ - pParams->OutputAudioSamplingFrequency = - M4VIDEOEDITING_kDefault_ASF; - } - else - { - pParams->OutputAudioSamplingFrequency = - xVSS_context->pSettings-> - xVSS.outputAudioSamplFreq; - } - break; - } - - default: /* Should not happen !! */ - pParams->OutputAudioFormat = M4VIDEOEDITING_kAMR_NB; - pParams->OutputAudioBitrate = - M4VIDEOEDITING_k12_2_KBPS; - pParams->bAudioMono = M4OSA_TRUE; - pParams->OutputAudioSamplingFrequency = - M4VIDEOEDITING_kDefault_ASF; - break; - } - } - else - { - pParams->OutputAudioFormat = M4VIDEOEDITING_kNullAudio; - } - - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = xVSS_context->pSettings->pClipList[i]->pFile; - length = strlen(pDecodedPath); - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)xVSS_context->pSettings-> - pClipList[i]->pFile, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, - &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the UTF conversion, use the converted file path*/ - pParams->pFileIn = - (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS, - (M4OSA_Char *)"MCS 3GP Params: file in"); - - if( pParams->pFileIn == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - memcpy((void *)pParams->pFileIn, (void *)pDecodedPath, - (length + 1)); /* Copy input file path */ - - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = out_3gp; - length = strlen(pDecodedPath); - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)out_3gp, (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, - &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the UTF conversion, use the converted file path*/ - pParams->pFileOut = - (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS, - (M4OSA_Char *)"MCS 3GP Params: file out"); - - if( pParams->pFileOut == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - memcpy((void *)pParams->pFileOut, (void *)pDecodedPath, - (length + 1)); /* Copy output file path */ - -#ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE - /** - * UTF conversion: convert into the customer format, before being used*/ - - pDecodedPath = out_3gp_tmp; - length = strlen(pDecodedPath); - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)out_3gp_tmp, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, - &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the UTF conversion, use the converted file path*/ - pParams->pFileTemp = - (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS, - (M4OSA_Char *)"MCS 3GP Params: file temp"); - - if( pParams->pFileTemp == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - memcpy((void *)pParams->pFileTemp, (void *)pDecodedPath, - (length + 1)); /* Copy temporary file path */ - -#else - - pParams->pFileTemp = M4OSA_NULL; - -#endif /*M4xVSS_RESERVED_MOOV_DISK_SPACE*/ - - /*FB 2008/10/20 keep media aspect ratio, add media rendering parameter*/ - - if( xVSS_context->pSettings->pClipList[i]->xVSS.MediaRendering - == M4xVSS_kCropping - || xVSS_context->pSettings->pClipList[i]->xVSS. - MediaRendering == M4xVSS_kBlackBorders - || xVSS_context->pSettings->pClipList[i]->xVSS. - MediaRendering == M4xVSS_kResizing ) - { - pParams->MediaRendering = - xVSS_context->pSettings->pClipList[i]->xVSS. - MediaRendering; - } - - /*FB: transcoding per parts*/ - pParams->BeginCutTime = - xVSS_context->pSettings->pClipList[i]->uiBeginCutTime; - pParams->EndCutTime = - xVSS_context->pSettings->pClipList[i]->uiEndCutTime; - - pParams->pNext = M4OSA_NULL; - pParams->isBGM = M4OSA_FALSE; - pParams->isCreated = M4OSA_FALSE; - xVSS_context->nbStepTotal++; - bIsTranscoding = M4OSA_TRUE; - -replace3GP_3GP: - /* Update total duration */ - totalDuration += - xVSS_context->pSettings->pClipList[i]->uiEndCutTime - - xVSS_context->pSettings->pClipList[i]->uiBeginCutTime; - - /* Replacing in VSS structure the original 3GP file by the transcoded 3GP file */ - xVSS_context->pSettings->pClipList[i]->FileType = - M4VIDEOEDITING_kFileType_3GPP; - - if( xVSS_context->pSettings->pClipList[i]->pFile != M4OSA_NULL ) - { - free(xVSS_context->pSettings->pClipList[i]->pFile); - xVSS_context->pSettings->pClipList[i]->pFile = M4OSA_NULL; - } - - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = pParams->pFileOut; - - if( xVSS_context->UTFConversionContext.pConvToUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertToUTF8(xVSS_context, - (M4OSA_Void *)pParams->pFileOut, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, - &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: M4xVSS_internalConvertToUTF8 returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer; - } - else - { - length = strlen(pDecodedPath); - } - /** - * End of the UTF conversion, use the converted file path*/ - xVSS_context->pSettings->pClipList[i]->pFile = M4OSA_32bitAlignedMalloc( - (length + 1), - M4VS, (M4OSA_Char *)"xVSS file path of 3gp to 3gp"); - - if( xVSS_context->pSettings->pClipList[i]->pFile == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - memcpy((void *)xVSS_context->pSettings->pClipList[i]->pFile, - (void *)pDecodedPath, (length + 1)); - /*FB: add file path size because of UTF 16 conversion*/ - xVSS_context->pSettings->pClipList[i]->filePathSize = length+1; - - /* We define master clip as first 3GP input clip */ - /*if(xVSS_context->pSettings->uiMasterClip == 0 && fileProperties. - AudioStreamType != M4VIDEOEDITING_kNoneAudio) - { - xVSS_context->pSettings->uiMasterClip = i; - }*/ - } - else - { - /* Update total duration */ - totalDuration += - xVSS_context->pSettings->pClipList[i]->uiEndCutTime - - xVSS_context->pSettings->pClipList[i]->uiBeginCutTime; - } - /* We define master clip as first 3GP input clip */ - if( masterClip == -1 - && fileProperties.AudioStreamType != M4VIDEOEDITING_kNoneAudio ) - { - masterClip = i; - xVSS_context->pSettings->uiMasterClip = i; - } - - } - /************************** - Other input file type case - ***************************/ - else - { - M4OSA_TRACE1_0("Bad file type as input clip"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_PARAMETER; - } - } - - /********************************************************* - * Parse all effects to make some adjustment for framing, * - * text and to transform relative time into absolute time * - **********************************************************/ - for ( j = 0; j < xVSS_context->pSettings->nbEffects; j++ ) - { - /* Copy effect to "local" structure */ - memcpy((void *) &(xVSS_context->pSettings->Effects[j]), - (void *) &(pSettings->Effects[j]), - sizeof(M4VSS3GPP_EffectSettings)); - - /* Prevent from bad initializing of effect percentage time */ - if( xVSS_context->pSettings->Effects[j].xVSS.uiDurationPercent > 100 - || xVSS_context->pSettings->Effects[j].xVSS.uiStartPercent > 100 ) - { - /* These percentage time have probably not been initialized */ - /* Let's not use them by setting them to 0 */ - xVSS_context->pSettings->Effects[j].xVSS.uiDurationPercent = 0; - xVSS_context->pSettings->Effects[j].xVSS.uiStartPercent = 0; - } - - /* If we have percentage information let's use it... Otherwise, we use absolute time. */ - if( xVSS_context->pSettings->Effects[j].xVSS.uiDurationPercent != 0 ) - { - xVSS_context->pSettings-> - Effects[j].uiStartTime = (M4OSA_UInt32)(totalDuration - * xVSS_context->pSettings->Effects[j].xVSS.uiStartPercent - / 100); - /* The percentage of effect duration is based on the duration of the clip - - start time */ - xVSS_context->pSettings-> - Effects[j].uiDuration = (M4OSA_UInt32)(totalDuration - * xVSS_context->pSettings->Effects[j].xVSS.uiDurationPercent - / 100); - } - - /* If there is a framing effect, we need to allocate framing effect structure */ - if( xVSS_context->pSettings->Effects[j].VideoEffectType - == M4xVSS_kVideoEffectType_Framing ) - { -#ifdef DECODE_GIF_ON_SAVING - - M4xVSS_FramingContext *framingCtx; - /*UTF conversion support*/ - M4OSA_Void *pDecodedPath = M4OSA_NULL; - -#else - - M4xVSS_FramingStruct *framingCtx; - -#endif /*DECODE_GIF_ON_SAVING*/ - - M4OSA_Char *pExt2 = M4OSA_NULL; - M4VIFI_ImagePlane *pPlane = - xVSS_context->pSettings->Effects[j].xVSS.pFramingBuffer; - M4OSA_Int32 result1, result2; - - /* Copy framing file path */ - if( pSettings->Effects[j].xVSS.pFramingFilePath != M4OSA_NULL ) - { - xVSS_context->pSettings-> - Effects[j].xVSS.pFramingFilePath = M4OSA_32bitAlignedMalloc( - strlen(pSettings->Effects[j].xVSS.pFramingFilePath) - + 1, M4VS, (M4OSA_Char *)"Local Framing file path"); - - if( xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath - == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - memcpy((void *)xVSS_context->pSettings-> - Effects[j].xVSS.pFramingFilePath, - (void *)pSettings-> - Effects[j].xVSS.pFramingFilePath, strlen( - pSettings->Effects[j].xVSS.pFramingFilePath) + 1); - - pExt2 = - xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath; - } - -#ifdef DECODE_GIF_ON_SAVING - - framingCtx = (M4xVSS_FramingContext - *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingContext), - M4VS, (M4OSA_Char *)"Context of the framing effect"); - - if( framingCtx == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - framingCtx->aFramingCtx = M4OSA_NULL; - framingCtx->aFramingCtx_last = M4OSA_NULL; - framingCtx->pSPSContext = M4OSA_NULL; - framingCtx->outputVideoSize = - xVSS_context->pSettings->xVSS.outputVideoSize; - framingCtx->topleft_x = - xVSS_context->pSettings->Effects[j].xVSS.topleft_x; - framingCtx->topleft_y = - xVSS_context->pSettings->Effects[j].xVSS.topleft_y; - framingCtx->bEffectResize = - xVSS_context->pSettings->Effects[j].xVSS.bResize; - framingCtx->pEffectFilePath = - xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath; - framingCtx->pFileReadPtr = xVSS_context->pFileReadPtr; - framingCtx->pFileWritePtr = xVSS_context->pFileWritePtr; - framingCtx->effectDuration = - xVSS_context->pSettings->Effects[j].uiDuration; - framingCtx->b_IsFileGif = M4OSA_FALSE; - framingCtx->alphaBlendingStruct = M4OSA_NULL; - framingCtx->b_animated = M4OSA_FALSE; - - /* Output ratio for the effect is stored in uiFiftiesOutFrameRate parameters of the - extended xVSS effects structure */ - if( xVSS_context->pSettings->Effects[j].xVSS.uiFiftiesOutFrameRate - != 0 ) - { - framingCtx->frameDurationRatio = - (M4OSA_Float)(( xVSS_context->pSettings-> - Effects[j].xVSS.uiFiftiesOutFrameRate) / 1000.0); - } - else - { - framingCtx->frameDurationRatio = 1.0; - } - - /*Alpha blending*/ - /*Check if the alpha blending parameters are corrects*/ - if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime > 100 ) - { - pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime = 0; - } - - if( pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime > 100 ) - { - pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime = 0; - } - - if( pSettings->Effects[j].xVSS.uialphaBlendingEnd > 100 ) - { - pSettings->Effects[j].xVSS.uialphaBlendingEnd = 100; - } - - if( pSettings->Effects[j].xVSS.uialphaBlendingMiddle > 100 ) - { - pSettings->Effects[j].xVSS.uialphaBlendingMiddle = 100; - } - - if( pSettings->Effects[j].xVSS.uialphaBlendingStart > 100 ) - { - pSettings->Effects[j].xVSS.uialphaBlendingStart = 100; - } - - if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime > 0 - || pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime > 0 ) - { - /*Allocate the alpha blending structure*/ - framingCtx->alphaBlendingStruct = - (M4xVSS_internalEffectsAlphaBlending *)M4OSA_32bitAlignedMalloc( - sizeof(M4xVSS_internalEffectsAlphaBlending), - M4VS, (M4OSA_Char *)"alpha blending structure"); - - if( framingCtx->alphaBlendingStruct == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - M4xVSS_freeCommand(xVSS_context); - return M4ERR_ALLOC; - } - /*Fill the alpha blending structure*/ - framingCtx->alphaBlendingStruct->m_fadeInTime = - pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime; - framingCtx->alphaBlendingStruct->m_fadeOutTime = - pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime; - framingCtx->alphaBlendingStruct->m_end = - pSettings->Effects[j].xVSS.uialphaBlendingEnd; - framingCtx->alphaBlendingStruct->m_middle = - pSettings->Effects[j].xVSS.uialphaBlendingMiddle; - framingCtx->alphaBlendingStruct->m_start = - pSettings->Effects[j].xVSS.uialphaBlendingStart; - - if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime - + pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime - > 100 ) - { - framingCtx->alphaBlendingStruct->m_fadeOutTime = - 100 - framingCtx->alphaBlendingStruct->m_fadeInTime; - } - } - - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = - xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath; - length = strlen(pDecodedPath); - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)xVSS_context->pSettings-> - Effects[j].xVSS.pFramingFilePath, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, - &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the UTF conversion, use the converted file path*/ - framingCtx->pEffectFilePath = M4OSA_32bitAlignedMalloc(length + 1, M4VS, - (M4OSA_Char *)"Local Framing file path"); - - if( framingCtx->pEffectFilePath == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - memcpy((void *)framingCtx->pEffectFilePath, - (void *)pDecodedPath, length + 1); - - /* Save framing structure associated with corresponding effect */ - xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt = - framingCtx; - -#else - - framingCtx = (M4xVSS_FramingStruct - *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct), - M4VS, (M4OSA_Char *)"Context of the framing effect"); - - if( framingCtx == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - - framingCtx->topleft_x = - xVSS_context->pSettings->Effects[j].xVSS.topleft_x; - framingCtx->topleft_y = - xVSS_context->pSettings->Effects[j].xVSS.topleft_y; - - /* BugFix 1.2.0: Leak when decoding error */ - framingCtx->FramingRgb = M4OSA_NULL; - framingCtx->FramingYuv = M4OSA_NULL; - framingCtx->pNext = framingCtx; - /* Save framing structure associated with corresponding effect */ - xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt = - framingCtx; - -#endif /*DECODE_GIF_ON_SAVING*/ - - if( pExt2 != M4OSA_NULL ) - { - /* Decode the image associated to the effect, and fill framing structure */ - pExt2 += (strlen((const char *)pExt2) - 4); - - result1 = strcmp((const char *)pExt2,(const char *)".rgb"); - result2 = strcmp((const char *)pExt2,(const char *)".RGB"); - - if( 0 == result1 || 0 == result2 ) - { -#ifdef DECODE_GIF_ON_SAVING - - framingCtx->aFramingCtx = - (M4xVSS_FramingStruct - *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct), - M4VS, - (M4OSA_Char - *) - "M4xVSS_internalDecodeGIF: Context of the framing effect"); - - if( framingCtx->aFramingCtx == M4OSA_NULL ) - { - M4OSA_TRACE1_0( - "Allocation error in M4xVSS_SendCommand"); - /* TODO: Translate error code of SPS to an xVSS error code */ - M4xVSS_freeCommand(xVSS_context); - return M4ERR_ALLOC; - } - framingCtx->aFramingCtx->pCurrent = - M4OSA_NULL; /* Only used by the first element of the chain */ - framingCtx->aFramingCtx->previousClipTime = -1; - framingCtx->aFramingCtx->FramingYuv = M4OSA_NULL; - framingCtx->aFramingCtx->FramingRgb = M4OSA_NULL; - framingCtx->aFramingCtx->topleft_x = - xVSS_context->pSettings->Effects[j].xVSS.topleft_x; - framingCtx->aFramingCtx->topleft_y = - xVSS_context->pSettings->Effects[j].xVSS.topleft_y; - /*To support ARGB8888 : get the width and height */ - - framingCtx->aFramingCtx->width = - xVSS_context->pSettings->Effects[j].xVSS.width; - framingCtx->aFramingCtx->height = - xVSS_context->pSettings->Effects[j].xVSS.height; - M4OSA_TRACE1_1("FRAMMING BEFORE M4xVSS_SendCommand %d", - framingCtx->aFramingCtx->width); - M4OSA_TRACE1_1("FRAMMING BEFORE M4xVSS_SendCommand %d", - framingCtx->aFramingCtx->height); - -#endif - - err = M4xVSS_internalConvertARGB888toYUV420_FrammingEffect( - xVSS_context, - &(xVSS_context->pSettings->Effects[j]), - framingCtx->aFramingCtx,xVSS_context->pSettings->xVSS.outputVideoSize); - M4OSA_TRACE3_1("FRAMING WIDTH BEFORE M4xVSS_SendCommand %d", - framingCtx->aFramingCtx->width); - M4OSA_TRACE3_1("FRAMING HEIGHT BEFORE M4xVSS_SendCommand %d", - framingCtx->aFramingCtx->height); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: M4xVSS_internalDecodePNG returned 0x%x", - err); - /* TODO: Translate error code of SPS to an xVSS error code */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - } - else - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: Not supported still picture format 0x%x", - err); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_PARAMETER; - } - } - else if( pPlane != M4OSA_NULL ) - { -#ifdef DECODE_GIF_ON_SAVING - - framingCtx->aFramingCtx = (M4xVSS_FramingStruct - *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct), - M4VS, (M4OSA_Char *)"Context of the framing effect"); - - if( framingCtx->aFramingCtx == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - - framingCtx->aFramingCtx->topleft_x = - xVSS_context->pSettings->Effects[j].xVSS.topleft_x; - framingCtx->aFramingCtx->topleft_y = - xVSS_context->pSettings->Effects[j].xVSS.topleft_y; - - /* BugFix 1.2.0: Leak when decoding error */ - framingCtx->aFramingCtx->FramingRgb = M4OSA_NULL; - framingCtx->aFramingCtx->FramingYuv = M4OSA_NULL; - framingCtx->aFramingCtx->pNext = framingCtx->aFramingCtx; - framingCtx->aFramingCtx->pCurrent = framingCtx->aFramingCtx; - framingCtx->aFramingCtx->duration = 0; - framingCtx->aFramingCtx->previousClipTime = -1; - framingCtx->aFramingCtx->FramingRgb = - xVSS_context->pSettings->Effects[j].xVSS.pFramingBuffer; - /* Force input RGB buffer to even size to avoid errors in YUV conversion */ - framingCtx->aFramingCtx->FramingRgb->u_width = - framingCtx->aFramingCtx->FramingRgb->u_width & ~1; - framingCtx->aFramingCtx->FramingRgb->u_height = - framingCtx->aFramingCtx->FramingRgb->u_height & ~1; - /* Input RGB plane is provided, let's convert it to YUV420, and update framing - structure */ - err = M4xVSS_internalConvertRGBtoYUV(framingCtx->aFramingCtx); - -#else - - framingCtx->FramingRgb = - xVSS_context->pSettings->Effects[j].xVSS.pFramingBuffer; - /* Force input RGB buffer to even size to avoid errors in YUV conversion */ - framingCtx->FramingRgb.u_width = - framingCtx->FramingRgb.u_width & ~1; - framingCtx->FramingRgb.u_height = - framingCtx->FramingRgb.u_height & ~1; - /* Input RGB plane is provided, let's convert it to YUV420, and update framing - structure */ - err = M4xVSS_internalConvertRGBtoYUV(framingCtx); - -#endif - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_sendCommand: error when converting RGB to YUV: 0w%x", - err); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return err; - } - } - else - { - M4OSA_TRACE1_0( - "M4xVSS_sendCommand: No input image/plane provided for framing effect."); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_PARAMETER; - } - } - /* CR: Add text handling with external text interface */ - /* If effect type is text, we call external text function to get RGB 565 buffer */ - if( xVSS_context->pSettings->Effects[j].VideoEffectType - == M4xVSS_kVideoEffectType_Text ) - { - /* Call the font engine function pointer to get RGB565 buffer */ - /* We transform text effect into framing effect from buffer */ - if( xVSS_context->pSettings->xVSS.pTextRenderingFct != M4OSA_NULL ) - { - /*FB: add UTF convertion for text buffer*/ - M4OSA_Void *pDecodedPath = M4OSA_NULL; -#ifdef DECODE_GIF_ON_SAVING - - M4xVSS_FramingContext *framingCtx; - -#else - - M4xVSS_FramingStruct *framingCtx; - -#endif /*DECODE_GIF_ON_SAVING*/ - -#ifdef DECODE_GIF_ON_SAVING - - framingCtx = (M4xVSS_FramingContext - *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingContext), - M4VS, (M4OSA_Char *)"Context of the framing effect"); - - if( framingCtx == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - framingCtx->aFramingCtx = M4OSA_NULL; - framingCtx->aFramingCtx_last = M4OSA_NULL; - framingCtx->pSPSContext = M4OSA_NULL; - framingCtx->outputVideoSize = - xVSS_context->pSettings->xVSS.outputVideoSize; - framingCtx->topleft_x = - xVSS_context->pSettings->Effects[j].xVSS.topleft_x; - framingCtx->topleft_y = - xVSS_context->pSettings->Effects[j].xVSS.topleft_y; - framingCtx->bEffectResize = - xVSS_context->pSettings->Effects[j].xVSS.bResize; - framingCtx->pEffectFilePath = - xVSS_context->pSettings->Effects[j].xVSS.pFramingFilePath; - framingCtx->pFileReadPtr = xVSS_context->pFileReadPtr; - framingCtx->pFileWritePtr = xVSS_context->pFileWritePtr; - framingCtx->effectDuration = - xVSS_context->pSettings->Effects[j].uiDuration; - framingCtx->b_IsFileGif = M4OSA_FALSE; - framingCtx->b_animated = M4OSA_FALSE; - framingCtx->alphaBlendingStruct = M4OSA_NULL; - - /* Save framing structure associated with corresponding effect */ - xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt = - framingCtx; - - framingCtx->aFramingCtx = (M4xVSS_FramingStruct - *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct), - M4VS, (M4OSA_Char *)"Context of the framing effect"); - - if( framingCtx->aFramingCtx == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - - framingCtx->aFramingCtx->topleft_x = - xVSS_context->pSettings->Effects[j].xVSS.topleft_x; - framingCtx->aFramingCtx->topleft_y = - xVSS_context->pSettings->Effects[j].xVSS.topleft_y; - - /* BugFix 1.2.0: Leak when decoding error */ - framingCtx->aFramingCtx->FramingRgb = M4OSA_NULL; - framingCtx->aFramingCtx->FramingYuv = M4OSA_NULL; - framingCtx->aFramingCtx->pNext = framingCtx->aFramingCtx; - framingCtx->aFramingCtx->pCurrent = framingCtx->aFramingCtx; - framingCtx->aFramingCtx->duration = 0; - framingCtx->aFramingCtx->previousClipTime = -1; - - /*Alpha blending*/ - /*Check if the alpha blending parameters are corrects*/ - if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime > 100 ) - { - pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime = 0; - } - - if( pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime > 100 ) - { - pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime = 0; - } - - if( pSettings->Effects[j].xVSS.uialphaBlendingEnd > 100 ) - { - pSettings->Effects[j].xVSS.uialphaBlendingEnd = 100; - } - - if( pSettings->Effects[j].xVSS.uialphaBlendingMiddle > 100 ) - { - pSettings->Effects[j].xVSS.uialphaBlendingMiddle = 100; - } - - if( pSettings->Effects[j].xVSS.uialphaBlendingStart > 100 ) - { - pSettings->Effects[j].xVSS.uialphaBlendingStart = 100; - } - - if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime > 0 - || pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime - > 0 ) - { - /*Allocate the alpha blending structure*/ - framingCtx->alphaBlendingStruct = - (M4xVSS_internalEffectsAlphaBlending *)M4OSA_32bitAlignedMalloc( - sizeof(M4xVSS_internalEffectsAlphaBlending), - M4VS, (M4OSA_Char *)"alpha blending structure"); - - if( framingCtx->alphaBlendingStruct == M4OSA_NULL ) - { - M4OSA_TRACE1_0( - "Allocation error in M4xVSS_SendCommand"); - M4xVSS_freeCommand(xVSS_context); - return M4ERR_ALLOC; - } - /*Fill the alpha blending structure*/ - framingCtx->alphaBlendingStruct->m_fadeInTime = - pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime; - framingCtx->alphaBlendingStruct->m_fadeOutTime = - pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime; - framingCtx->alphaBlendingStruct->m_end = - pSettings->Effects[j].xVSS.uialphaBlendingEnd; - framingCtx->alphaBlendingStruct->m_middle = - pSettings->Effects[j].xVSS.uialphaBlendingMiddle; - framingCtx->alphaBlendingStruct->m_start = - pSettings->Effects[j].xVSS.uialphaBlendingStart; - - if( pSettings->Effects[j].xVSS.uialphaBlendingFadeInTime - + pSettings->Effects[j].xVSS.uialphaBlendingFadeOutTime - > 100 ) - { - framingCtx->alphaBlendingStruct->m_fadeOutTime = - 100 - framingCtx->alphaBlendingStruct->m_fadeInTime; - } - } -#else - - framingCtx = (M4xVSS_FramingStruct - *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FramingStruct), - M4VS, (M4OSA_Char - *)"Context of the framing effect (for text)"); - - if( framingCtx == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - - framingCtx->topleft_x = - xVSS_context->pSettings->Effects[j].xVSS.topleft_x; - framingCtx->topleft_y = - xVSS_context->pSettings->Effects[j].xVSS.topleft_y; - framingCtx->FramingRgb = M4OSA_NULL; - - /* BugFix 1.2.0: Leak when decoding error */ - framingCtx->FramingYuv = M4OSA_NULL; - framingCtx->pNext = framingCtx; - -#endif - /* Save framing structure associated with corresponding effect */ - - xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt = - framingCtx; - - /* FB: changes for Video Artist: memcopy pTextBuffer so that it can be changed - after a complete analysis*/ - if( pSettings->Effects[j].xVSS.pTextBuffer == M4OSA_NULL ) - { - M4OSA_TRACE1_0("M4xVSS_SendCommand: pTextBuffer is null"); - M4xVSS_freeCommand(xVSS_context); - return M4ERR_PARAMETER; - } - - /*Convert text buffer into customer format before being used*/ - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = pSettings->Effects[j].xVSS.pTextBuffer; - xVSS_context->pSettings->Effects[j].xVSS.textBufferSize = - pSettings->Effects[j].xVSS.textBufferSize; - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)pSettings-> - Effects[j].xVSS.pTextBuffer, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, - &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer; - xVSS_context->pSettings->Effects[j].xVSS.textBufferSize = - length; - } - /** - * End of the UTF conversion, use the converted file path*/ - - xVSS_context->pSettings-> - Effects[j].xVSS.pTextBuffer = M4OSA_32bitAlignedMalloc( - xVSS_context->pSettings->Effects[j].xVSS.textBufferSize + 1, - M4VS, (M4OSA_Char *)"Local text buffer effect"); - - //xVSS_context->pSettings->Effects[j].xVSS.pTextBuffer = - // M4OSA_32bitAlignedMalloc(strlen(pSettings->Effects[j].xVSS.pTextBuffer)+1, - // M4VS, "Local text buffer effect"); - if( xVSS_context->pSettings->Effects[j].xVSS.pTextBuffer - == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - - if( pSettings->Effects[j].xVSS.pTextBuffer != M4OSA_NULL ) - { - //memcpy((M4OSA_MemAddr8)xVSS_context->pSettings->Effects[j] - //.xVSS.pTextBuffer, (M4OSA_MemAddr8)pSettings->Effects[j].xVSS.pTextBuffer, - // strlen(pSettings->Effects[j].xVSS.pTextBuffer)+1); - memcpy((void *)xVSS_context->pSettings-> - Effects[j].xVSS.pTextBuffer, - (void *)pDecodedPath, xVSS_context->pSettings-> - Effects[j].xVSS.textBufferSize + 1); - } - - /*Allocate the text RGB buffer*/ - framingCtx->aFramingCtx->FramingRgb = - (M4VIFI_ImagePlane *)M4OSA_32bitAlignedMalloc(sizeof(M4VIFI_ImagePlane), - M4VS, - (M4OSA_Char *)"RGB structure for the text effect"); - - if( framingCtx->aFramingCtx->FramingRgb == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - - if( xVSS_context->pSettings->Effects[j].xVSS.uiTextBufferWidth - == 0 || xVSS_context->pSettings-> - Effects[j].xVSS.uiTextBufferHeight == 0 ) - { - M4OSA_TRACE1_0( - "M4xVSS_SendCommand: text plane width and height are not defined"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_PARAMETER; - } - /* Allocate input RGB text buffer and force it to even size to avoid errors in - YUV conversion */ - framingCtx->aFramingCtx->FramingRgb->u_width = - xVSS_context->pSettings-> - Effects[j].xVSS.uiTextBufferWidth & ~1; - framingCtx->aFramingCtx->FramingRgb->u_height = - xVSS_context->pSettings-> - Effects[j].xVSS.uiTextBufferHeight & ~1; - framingCtx->aFramingCtx->FramingRgb->u_stride = - 2 * framingCtx->aFramingCtx->FramingRgb->u_width; - framingCtx->aFramingCtx->FramingRgb->u_topleft = 0; - framingCtx->aFramingCtx->FramingRgb->pac_data = - (M4VIFI_UInt8 *)M4OSA_32bitAlignedMalloc( - framingCtx->aFramingCtx->FramingRgb->u_height - * framingCtx->aFramingCtx->FramingRgb->u_stride, - M4VS, (M4OSA_Char *)"Text RGB plane->pac_data"); - - if( framingCtx->aFramingCtx->FramingRgb->pac_data - == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - -#ifdef DECODE_GIF_ON_SAVING - /**/ - /* Call text rendering function */ - - err = xVSS_context->pSettings->xVSS.pTextRenderingFct( - xVSS_context->pSettings->Effects[j].xVSS.pRenderingData, - xVSS_context->pSettings-> - Effects[j].xVSS.pTextBuffer, - xVSS_context->pSettings-> - Effects[j].xVSS.textBufferSize, - &(framingCtx->aFramingCtx->FramingRgb)); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_0("Text rendering external function failed\n"); - M4xVSS_freeCommand(xVSS_context); - return err; - } - - /* Check that RGB buffer is set */ - if( framingCtx->aFramingCtx->FramingRgb == M4OSA_NULL ) - { - M4OSA_TRACE1_0( - "Text rendering function did not set RGB buffer correctly !"); - M4xVSS_freeCommand(xVSS_context); - return M4ERR_PARAMETER; - } - - /* Convert RGB plane to YUV420 and update framing structure */ - err = M4xVSS_internalConvertRGBtoYUV(framingCtx->aFramingCtx); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_sendCommand: error when converting RGB to YUV: 0w%x", - err); - M4xVSS_freeCommand(xVSS_context); - return err; - } - -#else - /**/ - /* Call text rendering function */ - - err = xVSS_context->pSettings->xVSS.pTextRenderingFct( - xVSS_context->pSettings->Effects[j].xVSS.pRenderingData, - xVSS_context->pSettings-> - Effects[j].xVSS.pTextBuffer, - xVSS_context->pSettings-> - Effects[j].xVSS.textBufferSize, - &(framingCtx->FramingRgb)); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_0("Text rendering external function failed\n"); - M4xVSS_freeCommand(xVSS_context); - return err; - } - - /* Check that RGB buffer is set */ - if( framingCtx->FramingRgb == M4OSA_NULL ) - { - M4OSA_TRACE1_0( - "Text rendering function did not set RGB buffer correctly !"); - M4xVSS_freeCommand(xVSS_context); - return M4ERR_PARAMETER; - } - - /* Convert RGB plane to YUV420 and update framing structure */ - err = M4xVSS_internalConvertRGBtoYUV(framingCtx); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_sendCommand: error when converting RGB to YUV: 0w%x", - err); - M4xVSS_freeCommand(xVSS_context); - return err; - } - -#endif /*DECODE_GIF_ON_SAVING*/ - - /* Change internally effect type from "text" to framing */ - - xVSS_context->pSettings->Effects[j].VideoEffectType = - M4xVSS_kVideoEffectType_Framing; - xVSS_context->pSettings->Effects[j].xVSS.bResize = M4OSA_FALSE; - } - else - { - M4OSA_TRACE1_0( - "M4xVSS_sendCommand: No text rendering function set !!"); - M4xVSS_freeCommand(xVSS_context); - return M4ERR_PARAMETER; - } - } - - /* Allocate the structure to store the data needed by the Fifties effect */ - else if( xVSS_context->pSettings->Effects[j].VideoEffectType - == M4xVSS_kVideoEffectType_Fifties ) - { - M4xVSS_FiftiesStruct *fiftiesCtx; - - /* Check the expected frame rate for the fifties effect (must be above 0) */ - if( 0 == xVSS_context->pSettings-> - Effects[j].xVSS.uiFiftiesOutFrameRate ) - { - M4OSA_TRACE1_0( - "The frame rate for the fifties effect must be greater than 0 !"); - M4xVSS_freeCommand(xVSS_context); - return M4ERR_PARAMETER; - } - - fiftiesCtx = (M4xVSS_FiftiesStruct - *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_FiftiesStruct), - M4VS, (M4OSA_Char *)"Context of the fifties effect"); - - if( fiftiesCtx == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return M4ERR_ALLOC; - } - - fiftiesCtx->previousClipTime = -1; - fiftiesCtx->fiftiesEffectDuration = 1000 / xVSS_context->pSettings-> - Effects[j].xVSS.uiFiftiesOutFrameRate; - fiftiesCtx->shiftRandomValue = 0; - fiftiesCtx->stripeRandomValue = 0; - - /* Save the structure associated with corresponding effect */ - xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt = - fiftiesCtx; - } - - /* Allocate the structure to store the data needed by the Color effect */ - else if( xVSS_context->pSettings->Effects[j].VideoEffectType - == M4xVSS_kVideoEffectType_ColorRGB16 - || xVSS_context->pSettings->Effects[j].VideoEffectType - == M4xVSS_kVideoEffectType_BlackAndWhite - || xVSS_context->pSettings->Effects[j].VideoEffectType - == M4xVSS_kVideoEffectType_Pink - || xVSS_context->pSettings->Effects[j].VideoEffectType - == M4xVSS_kVideoEffectType_Green - || xVSS_context->pSettings->Effects[j].VideoEffectType - == M4xVSS_kVideoEffectType_Sepia - || xVSS_context->pSettings->Effects[j].VideoEffectType - == M4xVSS_kVideoEffectType_Negative - || xVSS_context->pSettings->Effects[j].VideoEffectType - == M4xVSS_kVideoEffectType_Gradient ) - { - M4xVSS_ColorStruct *ColorCtx; - - ColorCtx = - (M4xVSS_ColorStruct *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_ColorStruct), - M4VS, (M4OSA_Char *)"Context of the color effect"); - - if( ColorCtx == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return M4ERR_ALLOC; - } - - ColorCtx->colorEffectType = - xVSS_context->pSettings->Effects[j].VideoEffectType; - - if( xVSS_context->pSettings->Effects[j].VideoEffectType - == M4xVSS_kVideoEffectType_ColorRGB16 - || xVSS_context->pSettings->Effects[j].VideoEffectType - == M4xVSS_kVideoEffectType_Gradient ) - { - ColorCtx->rgb16ColorData = - xVSS_context->pSettings->Effects[j].xVSS.uiRgb16InputColor; - } - else - { - ColorCtx->rgb16ColorData = 0; - } - - /* Save the structure associated with corresponding effect */ - xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt = - ColorCtx; - } - } - - /********************************** - Background music registering - **********************************/ - if( pSettings->xVSS.pBGMtrack != M4OSA_NULL && isNewBGM == M4OSA_TRUE ) - { -#ifdef PREVIEW_ENABLED - - M4xVSS_MCS_params *pParams; - M4OSA_Char *out_pcm; - /*UTF conversion support*/ - M4OSA_Void *pDecodedPath = M4OSA_NULL; - -#endif - - /* We save output file pointer, because we will need to use it when saving audio mixed - file (last save step) */ - - xVSS_context->pOutputFile = xVSS_context->pSettings->pOutputFile; - xVSS_context->pTemporaryFile = xVSS_context->pSettings->pTemporaryFile; - - /* If a previous BGM has already been registered, delete it */ - /* Here can be implemented test to know if the same BGM is registered */ - if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL ) - { - if( xVSS_context->pSettings->xVSS.pBGMtrack->pFile != M4OSA_NULL ) - { - free(xVSS_context->pSettings->xVSS.pBGMtrack-> - pFile); - xVSS_context->pSettings->xVSS.pBGMtrack->pFile = M4OSA_NULL; - } - free(xVSS_context->pSettings->xVSS.pBGMtrack); - xVSS_context->pSettings->xVSS.pBGMtrack = M4OSA_NULL; - } - - /* Allocate BGM */ - xVSS_context->pSettings->xVSS.pBGMtrack = - (M4xVSS_BGMSettings *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_BGMSettings), M4VS, - (M4OSA_Char *)"xVSS_context->pSettings->xVSS.pBGMtrack"); - - if( xVSS_context->pSettings->xVSS.pBGMtrack == M4OSA_NULL ) - { - M4xVSS_freeCommand(xVSS_context); - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - return M4ERR_ALLOC; - } - - /* Copy input structure to our structure */ - memcpy((void *)xVSS_context->pSettings->xVSS.pBGMtrack, - (void *)pSettings->xVSS.pBGMtrack, - sizeof(M4xVSS_BGMSettings)); - /* Allocate file name, and copy file name buffer to our structure */ - xVSS_context->pSettings->xVSS.pBGMtrack->pFile = - M4OSA_32bitAlignedMalloc((strlen(pSettings->xVSS.pBGMtrack->pFile) - + 1), M4VS, (M4OSA_Char *)"xVSS BGM file path"); - - if( xVSS_context->pSettings->xVSS.pBGMtrack->pFile == M4OSA_NULL ) - { - M4xVSS_freeCommand(xVSS_context); - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - return M4ERR_ALLOC; - } - memcpy((void *)xVSS_context->pSettings->xVSS.pBGMtrack->pFile, - (void *)pSettings->xVSS.pBGMtrack->pFile, - strlen(pSettings->xVSS.pBGMtrack->pFile) + 1); - -#ifdef PREVIEW_ENABLED - /* Decode BGM track to pcm output file */ - - pParams = - (M4xVSS_MCS_params *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_MCS_params), M4VS, - (M4OSA_Char *)"Element of MCS Params (for BGM)"); - - if( pParams == M4OSA_NULL ) - { - M4xVSS_freeCommand(xVSS_context); - M4OSA_TRACE1_0( - "M4xVSS_sendCommand: Problem when allocating one element MCS Params"); - return M4ERR_ALLOC; - } - - /* Initialize the pointers in case of problem (PR 2273) */ - pParams->pFileIn = M4OSA_NULL; - pParams->pFileOut = M4OSA_NULL; - pParams->pFileTemp = M4OSA_NULL; - pParams->pNext = M4OSA_NULL; - pParams->BeginCutTime = 0; - pParams->EndCutTime = 0; - - if( xVSS_context->pMCSparamsList - == M4OSA_NULL ) /* Means it is the first element of the list */ - { - /* Initialize the xVSS context with the first element of the list */ - xVSS_context->pMCSparamsList = pParams; - - } - else - { - M4xVSS_MCS_params *pParams_temp = xVSS_context->pMCSparamsList; - M4xVSS_MCS_params *pParams_prev = M4OSA_NULL; - - /* Parse MCS params chained list to find and delete BGM element */ - while( pParams_temp != M4OSA_NULL ) - { - if( pParams_temp->isBGM == M4OSA_TRUE ) - { - /* Remove this element */ - if( pParams_temp->pFileIn != M4OSA_NULL ) - { - free(pParams_temp->pFileIn); - pParams_temp->pFileIn = M4OSA_NULL; - } - - if( pParams_temp->pFileOut != M4OSA_NULL ) - { - /* Remove PCM temporary file */ - remove((const char *)pParams_temp->pFileOut); - free(pParams_temp->pFileOut); - pParams_temp->pFileOut = M4OSA_NULL; - } - /* Chain previous element with next element = remove BGM chained - list element */ - if( pParams_prev != M4OSA_NULL ) - { - pParams_prev->pNext = pParams_temp->pNext; - } - /* If current pointer is the first of the chained list and next pointer of - the chained list is NULL */ - /* it means that there was only one element in the list */ - /* => we put the context variable to NULL to reaffect the first chained list - element */ - if( pParams_temp == xVSS_context->pMCSparamsList - && pParams_temp->pNext == M4OSA_NULL ) - { - xVSS_context->pMCSparamsList = M4OSA_NULL; - } - /* In that case, BGM pointer is the first one, but there are others elements - after it */ - /* So, we need to change first chained list element */ - else if( pParams_temp->pNext != M4OSA_NULL - && pParams_prev == M4OSA_NULL ) - { - xVSS_context->pMCSparamsList = pParams_temp->pNext; - } - - if( pParams_temp->pNext != M4OSA_NULL ) - { - pParams_prev = pParams_temp->pNext; - free(pParams_temp); - pParams_temp = M4OSA_NULL; - pParams_temp = pParams_prev; - } - else - { - free(pParams_temp); - pParams_temp = M4OSA_NULL; - } - } - else - { - pParams_prev = pParams_temp; - pParams_temp = pParams_temp->pNext; - } - } - /* We need to initialize the last element of the chained list to be able to add new - BGM element */ - pMCS_last = pParams_prev; - - if( xVSS_context->pMCSparamsList == M4OSA_NULL ) - { - /* In that case, it means that there was only one element in the chained list */ - /* So, we need to save the new params*/ - xVSS_context->pMCSparamsList = pParams; - } - else - { - /* Update next pointer of the previous last element of the chain */ - pMCS_last->pNext = pParams; - } - - } - - /* Fill the last M4xVSS_MCS_params element */ - pParams->InputFileType = - xVSS_context->pSettings->xVSS.pBGMtrack->FileType; - pParams->OutputFileType = M4VIDEOEDITING_kFileType_PCM; - pParams->OutputVideoFormat = M4VIDEOEDITING_kNoneVideo; - pParams->OutputVideoFrameSize = M4VIDEOEDITING_kQCIF; - pParams->OutputVideoFrameRate = M4VIDEOEDITING_k15_FPS; - - if( xVSS_context->pSettings->xVSS.outputAudioFormat - == M4VIDEOEDITING_kAAC ) - { - pParams->OutputAudioFormat = M4VIDEOEDITING_kAAC; - pParams->OutputAudioSamplingFrequency = M4VIDEOEDITING_kDefault_ASF; - - /*FB: VAL CR P4ME00003076 - The output audio bitrate in the AAC case is now directly given by the user*/ - /*Check if the audio bitrate is correctly defined*/ - /*Mono - MCS values for AAC Mono are min: 16kbps and max: 192 kbps*/ - if( xVSS_context->pSettings->xVSS.outputAudioBitrate - >= M4VIDEOEDITING_k16_KBPS - && xVSS_context->pSettings->xVSS.outputAudioBitrate - <= M4VIDEOEDITING_k192_KBPS - && xVSS_context->pSettings->xVSS.bAudioMono == M4OSA_TRUE ) - { - pParams->OutputAudioBitrate = - xVSS_context->pSettings->xVSS.outputAudioBitrate; - } - /*Stereo - MCS values for AAC Mono are min: 32kbps and max: 192 kbps*/ - else if( xVSS_context->pSettings->xVSS.outputAudioBitrate - >= M4VIDEOEDITING_k32_KBPS - && xVSS_context->pSettings->xVSS.outputAudioBitrate - <= M4VIDEOEDITING_k192_KBPS - && xVSS_context->pSettings->xVSS.bAudioMono == M4OSA_FALSE ) - { - pParams->OutputAudioBitrate = - xVSS_context->pSettings->xVSS.outputAudioBitrate; - } - else - { - pParams->OutputAudioBitrate = M4VIDEOEDITING_k32_KBPS; - } - pParams->bAudioMono = xVSS_context->pSettings->xVSS.bAudioMono; - } - else - { - pParams->OutputAudioFormat = M4VIDEOEDITING_kAMR_NB; - pParams->OutputAudioSamplingFrequency = M4VIDEOEDITING_kDefault_ASF; - pParams->OutputAudioBitrate = M4VIDEOEDITING_k12_2_KBPS; - pParams->bAudioMono = M4OSA_TRUE; - } - pParams->OutputVideoBitrate = M4VIDEOEDITING_kUndefinedBitrate; - - /* Prepare output filename */ - /* 21 is the size of "preview_16000_2.pcm" + \0 */ - out_pcm = - (M4OSA_Char *)M4OSA_32bitAlignedMalloc(strlen(xVSS_context->pTempPath) - + 21, M4VS, (M4OSA_Char *)"Temp char* for pcmPreviewFile"); - - if( out_pcm == M4OSA_NULL ) - { - M4xVSS_freeCommand(xVSS_context); - M4OSA_TRACE1_0("Allocation error in M4xVSS_Init"); - return M4ERR_ALLOC; - } - - /* Copy temporary path to final preview path string */ - M4OSA_chrNCopy(out_pcm, xVSS_context->pTempPath, - strlen(xVSS_context->pTempPath) + 1); - - /* Depending of the output sample frequency and nb of channels, we construct preview - output filename */ - if( xVSS_context->pSettings->xVSS.outputAudioFormat - == M4VIDEOEDITING_kAAC ) - { - /* Construct output temporary PCM filename */ - if( xVSS_context->pSettings->xVSS.bAudioMono == M4OSA_TRUE ) - { - strncat((char *)out_pcm, (const char *)"preview_16000_1.pcm\0", - 20); - } - else - { - strncat((char *)out_pcm, (const char *)"preview_16000_2.pcm\0", - 20); - } - } - else if( xVSS_context->pSettings->xVSS.outputAudioFormat - == M4VIDEOEDITING_kAMR_NB ) - { - /* Construct output temporary PCM filename */ - strncat((char *)out_pcm, (const char *)"preview_08000_1.pcm\0", 20); - } - else - { - if( out_pcm != M4OSA_NULL ) - { - free(out_pcm); - out_pcm = M4OSA_NULL; - } - M4xVSS_freeCommand(xVSS_context); - M4OSA_TRACE1_0("Bad audio output format \n"); - return M4ERR_PARAMETER; - } - - xVSS_context->pcmPreviewFile = out_pcm; - - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = out_pcm; - length = strlen(pDecodedPath); - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)out_pcm, (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the UTF conversion, use the converted file path*/ - xVSS_context->pcmPreviewFile = - (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS, - (M4OSA_Char *)"pcmPreviewFile"); - - if( xVSS_context->pcmPreviewFile == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - free(out_pcm); - out_pcm = M4OSA_NULL; - /*FB: to avoid leaks when there is an error in the send command*/ - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - /**/ - return M4ERR_ALLOC; - } - memcpy((void *)xVSS_context->pcmPreviewFile, (void *)pDecodedPath, length + 1); - - /* Free temporary output filename */ - if( out_pcm != M4OSA_NULL ) - { - free(out_pcm); - out_pcm = M4OSA_NULL; - } - - pParams->pFileOut = M4OSA_32bitAlignedMalloc((length + 1), M4VS, - (M4OSA_Char *)"MCS BGM Params: file out"); - - if( pParams->pFileOut == M4OSA_NULL ) - { - M4xVSS_freeCommand(xVSS_context); - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - return M4ERR_ALLOC; - } - pParams->pFileTemp = M4OSA_NULL; - - memcpy((void *)pParams->pFileOut,(void *) xVSS_context->pcmPreviewFile, - (length + 1)); /* Copy output file path */ - - /** - * UTF conversion: convert into the customer format, before being used*/ - - pDecodedPath = xVSS_context->pSettings->xVSS.pBGMtrack->pFile; - length = strlen(pDecodedPath); - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)xVSS_context->pSettings->xVSS.pBGMtrack-> - pFile, (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SendCommand: M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the UTF conversion, use the converted file path*/ - pParams->pFileIn = (M4OSA_Void *)M4OSA_32bitAlignedMalloc((length + 1), M4VS, - (M4OSA_Char *)"MCS BGM Params: file in"); - - if( pParams->pFileIn == M4OSA_NULL ) - { - M4xVSS_freeCommand(xVSS_context); - M4OSA_TRACE1_0("Allocation error in M4xVSS_SendCommand"); - return M4ERR_ALLOC; - } - memcpy((void *)pParams->pFileIn, (void *)pDecodedPath, - (length + 1)); /* Copy input file path */ - - pParams->isBGM = M4OSA_TRUE; - pParams->isCreated = M4OSA_FALSE; - xVSS_context->nbStepTotal++; - bIsTranscoding = M4OSA_TRUE; -#endif /* PREVIEW_ENABLED */ - - } - else if( pSettings->xVSS.pBGMtrack != M4OSA_NULL - && isNewBGM == M4OSA_FALSE ) - { -#ifdef PREVIEW_ENABLED - /* BGM is the same as previously, no need to redecode audio */ - /* Need to update MCS params chained list, to signal M4xVSS_step function to skip - BGM decoding */ - - M4xVSS_MCS_params *pParams_temp = xVSS_context->pMCSparamsList; - M4xVSS_MCS_params *pParams_prev = M4OSA_NULL; - -#endif /* PREVIEW_ENABLED */ - /* We save output file pointer, because we will need to use it when saving audio - mixed file (last save step) */ - - xVSS_context->pOutputFile = xVSS_context->pSettings->pOutputFile; - xVSS_context->pTemporaryFile = xVSS_context->pSettings->pTemporaryFile; - - /* Re-write BGM settings in case they have changed between two sendCommand */ - xVSS_context->pSettings->xVSS.pBGMtrack->uiAddCts = - pSettings->xVSS.pBGMtrack->uiAddCts; - xVSS_context->pSettings->xVSS.pBGMtrack->uiAddVolume = - pSettings->xVSS.pBGMtrack->uiAddVolume; - xVSS_context->pSettings->xVSS.pBGMtrack->uiBeginLoop = - pSettings->xVSS.pBGMtrack->uiBeginLoop; - xVSS_context->pSettings->xVSS.pBGMtrack->uiEndLoop = - pSettings->xVSS.pBGMtrack->uiEndLoop; - -#ifdef PREVIEW_ENABLED - /* Parse MCS params chained list to find and delete BGM element */ - - while( pParams_temp != M4OSA_NULL ) - { - if( pParams_temp->isBGM == M4OSA_TRUE ) - { - pParams_temp->isCreated = M4OSA_TRUE; - break; - } - pParams_prev = pParams_temp; - pParams_temp = pParams_temp->pNext; - } - -#endif /* PREVIEW_ENABLED */ - - M4OSA_TRACE2_0("M4xVSS_SendCommand has been recalled, BGM is the same"); - } - else - { - M4OSA_TRACE1_0("No BGM in this xVSS command"); - - if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL ) - { -#ifdef PREVIEW_ENABLED - /* Need to remove MCS previous params chained list */ - - M4xVSS_MCS_params *pParams_temp = xVSS_context->pMCSparamsList; - M4xVSS_MCS_params *pParams_prev = M4OSA_NULL; - - /* Parse MCS params chained list to find and delete BGM element */ - while( pParams_temp != M4OSA_NULL ) - { - if( pParams_temp->isBGM == M4OSA_TRUE ) - { - /* Remove this element */ - if( pParams_temp->pFileIn != M4OSA_NULL ) - { - free(pParams_temp->pFileIn); - pParams_temp->pFileIn = M4OSA_NULL; - } - - if( pParams_temp->pFileOut != M4OSA_NULL ) - { - free(pParams_temp->pFileOut); - pParams_temp->pFileOut = M4OSA_NULL; - } - /* Chain previous element with next element */ - if( pParams_prev != M4OSA_NULL ) - { - pParams_prev->pNext = pParams_temp->pNext; - } - /* If current pointer is the first of the chained list and next pointer - of the chained list is NULL */ - /* it means that there was only one element in the list */ - /* => we put the context variable to NULL */ - if( pParams_temp == xVSS_context->pMCSparamsList - && pParams_temp->pNext == M4OSA_NULL ) - { - free(pParams_temp); - xVSS_context->pMCSparamsList = M4OSA_NULL; - } - /* In that case, BGM pointer is the first one, but there are others - elements after it */ - /* So, we need to change first chained list element */ - else if( pParams_temp->pNext != M4OSA_NULL ) - { - xVSS_context->pMCSparamsList = pParams_temp->pNext; - free(pParams_temp); - pParams_temp = M4OSA_NULL; - } - /* In all other cases, nothing else to do except freeing the chained - list element */ - else - { - free(pParams_temp); - pParams_temp = M4OSA_NULL; - } - break; - } - pParams_prev = pParams_temp; - pParams_temp = pParams_temp->pNext; - } - -#endif /* PREVIEW_ENABLED */ - /* Here, we unallocate all BGM components and put xVSS_context->pSettings-> - xVSS.pBGMtrack to NULL */ - - if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL ) - { - if( xVSS_context->pSettings->xVSS.pBGMtrack->pFile - != M4OSA_NULL ) - { - free(xVSS_context->pSettings->xVSS.pBGMtrack->pFile); - xVSS_context->pSettings->xVSS.pBGMtrack->pFile = M4OSA_NULL; - } - free(xVSS_context->pSettings->xVSS.pBGMtrack); - xVSS_context->pSettings->xVSS.pBGMtrack = M4OSA_NULL; - } - } - } - - /* Changed to be able to mix with video only files -> in case no master clip is found - (i.e only JPG input or video only input) */ - /* and if there is a BGM, we force the added volume to 100 (i.e replace audio) */ - - if( masterClip == -1 - && xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL ) - { - /* In that case, it means that no input 3GP file has a video track. - Therefore, if a mixing is asked, it will fail. Thus, we force replace audio. */ - xVSS_context->pSettings->xVSS.pBGMtrack->uiAddVolume = 100; - } - - /* Save clip number to know if a M4xVSS_sendCommand has already been called */ - xVSS_context->previousClipNumber = xVSS_context->pSettings->uiClipNumber; - - /* Change state */ - xVSS_context->m_state = M4xVSS_kStateAnalyzing; - - /* In case of MMS use case, we compute here the max video bitrate */ - /* In case of too low bitrate, a specific warning is returned */ - if( xVSS_context->pSettings->xVSS.outputFileSize != 0 && totalDuration > 0 ) - { - M4OSA_UInt32 targetedBitrate = 0; - M4VIDEOEDITING_ClipProperties fileProperties; - M4OSA_Double ratio; - - if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL ) - { - if( xVSS_context->pSettings->xVSS.pBGMtrack->uiAddVolume - == 100 ) /* We are in "replace audio mode, need to check the filetype */ - { - if( xVSS_context->pSettings->xVSS.pBGMtrack->FileType - == M4VIDEOEDITING_kFileType_3GPP ) - { - M4OSA_Void *pDecodedPath; - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = - xVSS_context->pSettings->xVSS.pBGMtrack->pFile; - length = strlen(pDecodedPath); - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)xVSS_context->pSettings-> - xVSS.pBGMtrack->pFile, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext. - pTempOutConversionBuffer, &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1("M4xVSS_SendCommand: \ - M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - return err; - } - pDecodedPath = xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the UTF conversion, use the converted file path*/ - err = - M4xVSS_internalGetProperties(xVSS_context, pDecodedPath, - &fileProperties); - - /* Get the properties of the BGM track */ - /*err = M4xVSS_internalGetProperties(xVSS_context, xVSS_context->pSettings-> - xVSS.pBGMtrack->pFile, &fileProperties);*/ - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_sendCommand: M4xVSS_internalGetProperties returned an error:\ - 0x%x", err); - return err; - } - - if( fileProperties.AudioStreamType - != M4VIDEOEDITING_kAMR_NB ) - { - M4OSA_TRACE1_0( - "M4xVSS_sendCommand: Impossible to use MMS mode with BGM != AMR-NB"); - return M4ERR_PARAMETER; - } - } - else if( xVSS_context->pSettings->xVSS.pBGMtrack->FileType - != M4VIDEOEDITING_kFileType_AMR - && xVSS_context->pSettings->xVSS.pBGMtrack->FileType - != M4VIDEOEDITING_kFileType_MP3 ) - { - M4OSA_TRACE1_0("M4xVSS_sendCommand: Bad input BGM file"); - return M4ERR_PARAMETER; - } - } - } - - /* Compute targeted bitrate, with 8% margin (moov) */ - if( totalDuration > 1000 ) - { - targetedBitrate = - (M4OSA_UInt32)(( xVSS_context->pSettings->xVSS.outputFileSize - * 8 * 0.84) / (totalDuration / 1000)); - } - else - { - targetedBitrate = 0; - } - - /* Remove audio bitrate */ - if( targetedBitrate >= 12200 ) - { - targetedBitrate -= 12200; /* Only AMR is supported in MMS case */ - } - else - { - targetedBitrate = 0; - } - - /* Compute an indicator of "complexity" depending on nb of sequences and total duration */ - /* The highest is the number of sequences, the more there are some I frames */ - /* In that case, it is necessary to reduce the target bitrate */ - ratio = - (M4OSA_Double)((M4OSA_Double)(xVSS_context->pSettings->uiClipNumber - * 100000) / (M4OSA_Double)(totalDuration)); - M4OSA_TRACE2_3( - "Ratio clip_nb/duration = %f\nTargeted bitrate = %d\nTotal duration: %d", - (M4OSA_Double)((M4OSA_Double)(xVSS_context->pSettings->uiClipNumber - * 100000) / (M4OSA_Double)(totalDuration)), - targetedBitrate, totalDuration); - - if( ratio > 50 && ratio <= 75 ) - { - /* It means that there is a potential risk of having a higher file size - than specified */ - targetedBitrate -= (M4OSA_UInt32)(targetedBitrate * 0.1); - M4OSA_TRACE2_2( - "New bitrate1 !!\nRatio clip_nb/duration = %f\nTargeted bitrate = %d", - ratio, targetedBitrate); - } - else if( ratio > 75 ) - { - targetedBitrate -= (M4OSA_UInt32)(targetedBitrate * 0.15); - M4OSA_TRACE2_2( - "New bitrate2 !!\nRatio clip_nb/duration = %f\nTargeted bitrate = %d", - ratio, targetedBitrate); - } - - /*CR 3283 MMS use case for VAL: - Decrease the output file size to keep a margin of 5% - The writer will stop when the targeted output file size will be reached*/ - xVSS_context->pSettings->xVSS.outputFileSize -= - (M4OSA_UInt32)(xVSS_context->pSettings->xVSS.outputFileSize * 0.05); - - switch( xVSS_context->pSettings->xVSS.outputVideoSize ) - { - case M4VIDEOEDITING_kSQCIF: - if( targetedBitrate < 32000 ) - { - xVSS_context->targetedBitrate = 32000; - return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED; - } - break; - - case M4VIDEOEDITING_kQQVGA: - if( targetedBitrate < 32000 ) /*48000)*/ - { - xVSS_context->targetedBitrate = 32000; /*48000;*/ - return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED; - } - break; - - case M4VIDEOEDITING_kQCIF: - if( targetedBitrate < 48000 ) /*64000)*/ - { - xVSS_context->targetedBitrate = 48000; /*64000;*/ - return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED; - } - break; - - case M4VIDEOEDITING_kQVGA: - if( targetedBitrate < 64000 ) /*128000)*/ - { - xVSS_context->targetedBitrate = 64000; /*128000;*/ - return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED; - } - break; - - case M4VIDEOEDITING_kCIF: - if( targetedBitrate < 128000 ) - { - xVSS_context->targetedBitrate = 128000; - return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED; - } - break; - - case M4VIDEOEDITING_kVGA: - if( targetedBitrate < 192000 ) - { - xVSS_context->targetedBitrate = 192000; - return M4VSS3GPP_WAR_OUTPUTFILESIZE_EXCEED; - } - break; - - default: - /* Cannot happen */ - M4OSA_TRACE1_0( - "M4xVSS_sendCommand: Error in output fileSize !"); - return M4ERR_PARAMETER; - break; - } - xVSS_context->targetedBitrate = (M4OSA_UInt32)targetedBitrate; - } - - if( bIsTranscoding ) - { - return M4VSS3GPP_WAR_TRANSCODING_NECESSARY; - } - else - { - return M4NO_ERROR; - } -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_SaveStart(M4OSA_Context pContext, M4OSA_Char* pFilePath) - * @brief This function prepare the save - * @note The xVSS create 3GP edited final file - * This function must be called once M4xVSS_Step has returned - * M4VSS3GPP_WAR_ANALYZING_DONE - * After this function, the user must call M4xVSS_Step until - * it returns another error than M4NO_ERROR. - * - * @param pContext (IN) Pointer on the xVSS edit context - * @param pFilePath (IN) If the user wants to provide a different - * output filename, else can be NULL (allocated by the user) - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_ALLOC: Memory allocation has failed - * @return M4ERR_STATE: This function cannot not be called at this time - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_SaveStart( M4OSA_Context pContext, M4OSA_Void *pFilePath, - M4OSA_UInt32 filePathSize ) -{ - M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext; - M4OSA_ERR err; - - /*Add for UTF conversion: copy the pSettings structure into a new pCurrentEditSettings*/ - M4VSS3GPP_EditSettings *pEditSavingSettings = M4OSA_NULL; - M4OSA_UInt8 i, j; - M4OSA_UInt32 offset = 0; - M4OSA_UInt8 nbEffects = 0; - /*only for UTF conversion support*/ - M4OSA_Void *pDecodedPath = M4OSA_NULL; - M4OSA_UInt32 length = 0; - /**/ - - /* Check state */ - if( xVSS_context->m_state != M4xVSS_kStateOpened ) - { - M4OSA_TRACE1_1( - "Bad state when calling M4xVSS_SaveStart function! State is %d", - xVSS_context->m_state); - return M4ERR_STATE; - } - - /* RC: to temporary handle changing of output filepath */ - /* TO BE CHANGED CLEANLY WITH A MALLOC/MEMCPY !!!! */ - if( pFilePath != M4OSA_NULL ) - { - if( xVSS_context->pSettings->pOutputFile != M4OSA_NULL ) - { - /*it means that pOutputFile has been allocated in M4xVSS_sendCommand()*/ - free(xVSS_context->pSettings->pOutputFile); - xVSS_context->pSettings->pOutputFile = M4OSA_NULL; - xVSS_context->pSettings->uiOutputPathSize = 0; - } - - pDecodedPath = pFilePath; - /*As all inputs of the xVSS are in UTF8, convert the output file path into the customer - format*/ - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)pFilePath, (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - filePathSize = length; - } - - xVSS_context->pOutputFile = - (M4OSA_Void *)M4OSA_32bitAlignedMalloc(filePathSize + 1, M4VS, - (M4OSA_Char *)"M4xVSS_SaveStart: output file"); - - if( xVSS_context->pOutputFile == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart"); - return M4ERR_ALLOC; - } - memcpy((void *)xVSS_context->pOutputFile, (void *)pDecodedPath, filePathSize + 1); - xVSS_context->pOutputFile[filePathSize] = '\0'; - xVSS_context->pSettings->pOutputFile = xVSS_context->pOutputFile; - xVSS_context->pSettings->uiOutputPathSize = filePathSize; - } - - /** - ***/ - - /*FB: Add for UTF conversion: copy the pSettings structure into a new pCurrentEditSettings*/ - /*It is the same principle as in the PreviewStart()*/ - pEditSavingSettings = - (M4VSS3GPP_EditSettings *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_EditSettings), - M4VS, (M4OSA_Char *)"Saving, copy of VSS structure"); - - if( pEditSavingSettings == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart"); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return M4ERR_ALLOC; - } - - /* Copy settings from input structure */ - memcpy((void *) &(pEditSavingSettings->xVSS), - (void *) &(xVSS_context->pSettings->xVSS), - sizeof(M4xVSS_EditSettings)); - - /* Initialize pEditSavingSettings structure */ - pEditSavingSettings->xVSS.pBGMtrack = M4OSA_NULL; - - pEditSavingSettings->videoFrameRate = - xVSS_context->pSettings->videoFrameRate; - pEditSavingSettings->uiClipNumber = xVSS_context->pSettings->uiClipNumber; - pEditSavingSettings->uiMasterClip = - xVSS_context->pSettings->uiMasterClip; /* VSS2.0 mandatory parameter */ - - /* Allocate savingSettings.pClipList/pTransitions structure */ - pEditSavingSettings->pClipList = (M4VSS3GPP_ClipSettings * - * )M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_ClipSettings *) - *pEditSavingSettings->uiClipNumber, - M4VS, (M4OSA_Char *)"xVSS, saving , copy of pClipList"); - - if( pEditSavingSettings->pClipList == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart"); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return M4ERR_ALLOC; - } - - if( pEditSavingSettings->uiClipNumber > 1 ) - { - pEditSavingSettings->pTransitionList = (M4VSS3GPP_TransitionSettings * - * )M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_TransitionSettings *) - *(pEditSavingSettings->uiClipNumber - 1), - M4VS, (M4OSA_Char *)"xVSS, saving, copy of pTransitionList"); - - if( pEditSavingSettings->pTransitionList == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart"); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return M4ERR_ALLOC; - } - } - else - { - pEditSavingSettings->pTransitionList = M4OSA_NULL; - } - - for ( i = 0; i < pEditSavingSettings->uiClipNumber; i++ ) - { - pEditSavingSettings->pClipList[i] = (M4VSS3GPP_ClipSettings - *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_ClipSettings), - M4VS, (M4OSA_Char *)"saving clip settings"); - - if( pEditSavingSettings->pClipList[i] == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart"); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return M4ERR_ALLOC; - } - - if( i < pEditSavingSettings->uiClipNumber - - 1 ) /* Because there is 1 less transition than clip number */ - { - pEditSavingSettings->pTransitionList[i] = - (M4VSS3GPP_TransitionSettings - *)M4OSA_32bitAlignedMalloc(sizeof(M4VSS3GPP_TransitionSettings), - M4VS, (M4OSA_Char *)"saving transition settings"); - - if( pEditSavingSettings->pTransitionList[i] == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart"); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return M4ERR_ALLOC; - } - } - } - - for ( i = 0; i < xVSS_context->pSettings->uiClipNumber; i++ ) - { - // Add MP4 file support - - if( ( xVSS_context->pSettings->pClipList[i]->FileType - == M4VIDEOEDITING_kFileType_3GPP) - || (xVSS_context->pSettings->pClipList[i]->FileType - == M4VIDEOEDITING_kFileType_MP4) - || (xVSS_context->pSettings->pClipList[i]->FileType - == M4VIDEOEDITING_kFileType_M4V) - || (xVSS_context->pSettings->pClipList[i]->FileType - == M4VIDEOEDITING_kFileType_ARGB8888)) - - { - /* Copy data from given structure to our saving structure */ - M4xVSS_DuplicateClipSettings(pEditSavingSettings->pClipList[i], - xVSS_context->pSettings->pClipList[i], - M4OSA_FALSE /* remove effects */); - - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = pEditSavingSettings->pClipList[i]->pFile; - length = strlen(pDecodedPath); - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = - M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void - *)pEditSavingSettings->pClipList[i]->pFile, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, - &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return err; - } - pDecodedPath = xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer; - - /** - * End of the UTF conversion, use the converted file path*/ - free( - pEditSavingSettings->pClipList[i]->pFile); - pEditSavingSettings->pClipList[i]->pFile = (M4OSA_Void - *)M4OSA_32bitAlignedMalloc((length + 1), - M4VS, (M4OSA_Char *)"saving transition settings"); - - if( pEditSavingSettings->pClipList[i]->pFile == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart"); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return M4ERR_ALLOC; - } - memcpy((void *)pEditSavingSettings->pClipList[i]->pFile, - (void *)pDecodedPath, length + 1); - } - /*FB: add file path size because of UTF 16 conversion*/ - pEditSavingSettings->pClipList[i]->filePathSize = length+1; - - if( i - < xVSS_context->pSettings->uiClipNumber - - 1 ) /* Because there is 1 less transition than clip number */ - { - memcpy( - (void *)pEditSavingSettings->pTransitionList[i], - (void *)xVSS_context->pSettings-> - pTransitionList[i], - sizeof(M4VSS3GPP_TransitionSettings)); - } - } - else - { - M4OSA_TRACE1_0( - "M4xVSS_SaveStart: Error when parsing xVSS_context->pSettings->pClipList[i]:\ - Bad file type"); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return M4ERR_PARAMETER; - } - } - - /* Count the number of video effects, used to know how much memory is needed to allocate*/ - /* FB 2008/10/15: removed : not compatible with M4VSS3GPP_kVideoEffectType_None - for(j=0;j<xVSS_context->pSettings->nbEffects;j++) - { - if(xVSS_context->pSettings->Effects[j].VideoEffectType != M4VSS3GPP_kVideoEffectType_None) - { - nbEffects++; - } - }*/ - nbEffects = xVSS_context->pSettings->nbEffects; - - /* Allocate effects saving structure with correct number of effects */ - if( nbEffects != 0 ) - { - pEditSavingSettings->Effects = - (M4VSS3GPP_EffectSettings *)M4OSA_32bitAlignedMalloc(nbEffects - * sizeof(M4VSS3GPP_EffectSettings), M4VS, (M4OSA_Char - *)"Saving settings, effects table of structure settings"); - - if( pEditSavingSettings->Effects == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart"); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return M4ERR_ALLOC; - } - - /* Just copy effect structure to saving structure, as effects time are now */ - /* relative to output clip time*/ - memcpy((void *)pEditSavingSettings->Effects, - (void *)xVSS_context->pSettings->Effects, - nbEffects * sizeof(M4VSS3GPP_EffectSettings)); - } - else - { - pEditSavingSettings->Effects = M4OSA_NULL; - pEditSavingSettings->nbEffects = 0; - } - pEditSavingSettings->nbEffects = nbEffects; - - if( pFilePath != M4OSA_NULL ) - { - pEditSavingSettings->pOutputFile = pFilePath; - } - - /* Save pointer of saving video editor to use in step function */ - xVSS_context->pCurrentEditSettings = pEditSavingSettings; - - /* Change output file name to temporary output file name, because final file will be - generated by audio mixer */ - if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL ) - { - - M4OSA_Char out_3gp[M4XVSS_MAX_PATH_LEN]; - M4OSA_Char out_3gp_tmp[M4XVSS_MAX_PATH_LEN]; - - /**/ - pEditSavingSettings->xVSS.pBGMtrack = - (M4xVSS_BGMSettings *)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_BGMSettings), M4VS, - (M4OSA_Char - *)"Saving settings, effects table of structure settings"); - - if( pEditSavingSettings->xVSS.pBGMtrack == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart"); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return M4ERR_ALLOC; - } - - /* Just copy effect structure to saving structure, as effects time are now */ - /* relative to output clip time*/ - memcpy((void *)pEditSavingSettings->xVSS.pBGMtrack, - (void *)xVSS_context->pSettings->xVSS.pBGMtrack, - sizeof(M4xVSS_BGMSettings)); - - /* Allocate file name, and copy file name buffer to our structure */ - pEditSavingSettings->xVSS.pBGMtrack->pFile = M4OSA_32bitAlignedMalloc( - (strlen(xVSS_context->pSettings->xVSS.pBGMtrack->pFile) - + 1), - M4VS, (M4OSA_Char *)"Saving struct xVSS BGM file path"); - - if( pEditSavingSettings->xVSS.pBGMtrack->pFile == M4OSA_NULL ) - { - M4xVSS_freeCommand(xVSS_context); - M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart"); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return M4ERR_ALLOC; - } - memcpy((void *)pEditSavingSettings->xVSS.pBGMtrack->pFile, - (void *)xVSS_context->pSettings->xVSS.pBGMtrack->pFile, - strlen(xVSS_context->pSettings->xVSS.pBGMtrack->pFile) - + 1); - - /*Copy BGM track file path*/ - - /** - * UTF conversion*/ - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)pEditSavingSettings->xVSS.pBGMtrack->pFile, - (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - - free(pEditSavingSettings->xVSS.pBGMtrack->pFile); - pEditSavingSettings->xVSS.pBGMtrack->pFile = - (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS, (M4OSA_Char - *)"M4xVSS_SaveStart: Temp filename in case of BGM"); - - if( pEditSavingSettings->xVSS.pBGMtrack->pFile == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart"); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return M4ERR_ALLOC; - } - memcpy((void *)pEditSavingSettings->xVSS.pBGMtrack->pFile, - (void *)pDecodedPath, length + 1); - } - - /**/ - - M4OSA_chrNCopy(out_3gp, xVSS_context->pTempPath, M4XVSS_MAX_PATH_LEN - 1); - M4OSA_chrNCopy(out_3gp_tmp, xVSS_context->pTempPath, M4XVSS_MAX_PATH_LEN - 1); - - /* Construct output temporary 3GP filename */ - strncat((char *)out_3gp, (const char *)"savetemp.3gp\0", 13); - strncat((char *)out_3gp_tmp, (const char *)"savetemp.tmp\0", 13); - - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = out_3gp; - length = strlen(pDecodedPath); - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)out_3gp, (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the UTF conversion, use the converted file path*/ - xVSS_context->pCurrentEditSettings->pOutputFile = - (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS, - (M4OSA_Char *)"M4xVSS_SaveStart: Temp filename in case of BGM"); - - if( xVSS_context->pCurrentEditSettings->pOutputFile == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart"); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return M4ERR_ALLOC; - } - memcpy((void *)xVSS_context->pCurrentEditSettings->pOutputFile, - (void *)pDecodedPath, length + 1); - xVSS_context->pCurrentEditSettings->uiOutputPathSize = length + 1; - - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = out_3gp_tmp; - length = strlen(pDecodedPath); - - if( xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void *)out_3gp_tmp, (M4OSA_Void *)xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer, &length); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SaveStart: M4xVSS_internalConvertFromUTF8 returns err: 0x%x", - err); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return err; - } - pDecodedPath = - xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the UTF conversion, use the converted file path*/ - xVSS_context->pCurrentEditSettings->pTemporaryFile = - (M4OSA_Void *)M4OSA_32bitAlignedMalloc(length + 1, M4VS, - (M4OSA_Char *)"M4xVSS_SaveStart: Temporary file"); - - if( xVSS_context->pCurrentEditSettings->pTemporaryFile == M4OSA_NULL ) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_SaveStart"); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - return M4ERR_ALLOC; - } - memcpy((void *)xVSS_context->pCurrentEditSettings->pTemporaryFile, - (void *)pDecodedPath, length + 1); - - /* Put nb of step for progression monitoring to 2, because audio mixing is needed */ - xVSS_context->nbStepTotal = 2; - } - else - { - xVSS_context->pCurrentEditSettings->pOutputFile = - xVSS_context->pOutputFile; - xVSS_context->pCurrentEditSettings->pTemporaryFile = M4OSA_NULL; - - /* Put nb of step for progression monitoring to 1, because no audio mixing is needed */ - xVSS_context->nbStepTotal = 1; - } - - /** - ***/ - - err = M4xVSS_internalGenerateEditedFile(xVSS_context); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_SaveStart: M4xVSS_internalGenerateEditedFile returned an error: 0x%x", - err); - - /**/ - if( xVSS_context->pCurrentEditSettings->pOutputFile != M4OSA_NULL - && xVSS_context->pSettings->xVSS.pBGMtrack == M4OSA_NULL ) - { - free(xVSS_context->pCurrentEditSettings-> - pOutputFile); - xVSS_context->pCurrentEditSettings->pOutputFile = M4OSA_NULL; - xVSS_context->pOutputFile = M4OSA_NULL; - } - - if( xVSS_context->pCurrentEditSettings->pTemporaryFile != M4OSA_NULL - && xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL ) - { - free(xVSS_context->pCurrentEditSettings-> - pTemporaryFile); - xVSS_context->pCurrentEditSettings->pTemporaryFile = M4OSA_NULL; - } - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - /* TODO: Translate error code of VSS to an xVSS error code */ - return err; - } - - /* Reinitialize current step number for progression monitoring */ - xVSS_context->currentStep = 0; - - /* Change xVSS state */ - xVSS_context->m_state = M4xVSS_kStateSaving; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_SaveStop(M4OSA_Context pContext) - * @brief This function unallocate save ressources and change xVSS - * internal state. - * @note This function must be called once M4xVSS_Step has returned - * M4VSS3GPP_WAR_SAVING_DONE - * - * @param pContext (IN) Pointer on the xVSS edit context - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_STATE: This function cannot not be called at this time - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_SaveStop( M4OSA_Context pContext ) -{ - M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext; - M4OSA_ERR err = M4NO_ERROR; - - /* Check state */ - if( xVSS_context->m_state != M4xVSS_kStateSaving ) - { - M4OSA_TRACE1_1( - "Bad state when calling M4xVSS_SaveStop function! State is %d", - xVSS_context->m_state); - return M4ERR_STATE; - } - - /* Free saving structures */ - M4xVSS_internalFreeSaving(xVSS_context); - - if( xVSS_context->pOutputFile != M4OSA_NULL ) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - - /* Change xVSS state */ - xVSS_context->m_state = M4xVSS_kStateSaved; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_Step(M4OSA_Context pContext, M4OSA_UInt8 *pProgress) - * @brief This function executes differents tasks, depending of xVSS - * internal state. - * @note This function: - * - analyses editing structure if called after M4xVSS_SendCommand - * - generates preview file if called after M4xVSS_PreviewStart - * - generates final edited file if called after M4xVSS_SaveStart - * - * @param pContext (IN) Pointer on the xVSS edit context - * @param pProgress (IN/OUT) Pointer on an integer giving a - * progress indication (between 0-100) - * @return M4NO_ERROR: No error, the user must call M4xVSS_Step again - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_STATE: This function cannot not be called at this time - * @return M4VSS3GPP_WAR_PREVIEW_READY: Preview file is generated - * @return M4VSS3GPP_WAR_SAVING_DONE: Final edited file is generated - * @return M4VSS3GPP_WAR_ANALYZING_DONE: Analyse is done - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_Step( M4OSA_Context pContext, M4OSA_UInt8 *pProgress ) -{ - M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext; - M4VSS3GPP_EditContext pVssCtxt = xVSS_context->pCurrentEditContext; - M4VSS3GPP_AudioMixingContext pAudioMixingCtxt = - xVSS_context->pAudioMixContext; - M4OSA_ERR err = M4NO_ERROR; - M4OSA_UInt8 uiProgress = 0; - - switch( xVSS_context->m_state ) - { - case M4xVSS_kStateSaving: - //case M4xVSS_kStateGeneratingPreview: - { - if( xVSS_context->editingStep - == M4xVSS_kMicroStateEditing ) /* VSS -> creating effects, transitions ... */ - { - /* RC: to delete unecessary temp files on the fly */ - M4VSS3GPP_InternalEditContext *pVSSContext = - (M4VSS3GPP_InternalEditContext *)pVssCtxt; - - err = M4VSS3GPP_editStep(pVssCtxt, &uiProgress); - - if( ( err != M4NO_ERROR) && (err != M4VSS3GPP_WAR_EDITING_DONE) - && (err != M4VSS3GPP_WAR_SWITCH_CLIP) ) - { - M4OSA_TRACE1_1( - "M4xVSS_Step: M4VSS3GPP_editStep returned 0x%x\n", err); - M4VSS3GPP_editCleanUp(pVssCtxt); - /* TODO ? : Translate error code of VSS to an xVSS error code ? */ - xVSS_context->pCurrentEditContext = M4OSA_NULL; - return err; - } - - /* RC: to delete unecessary temp files on the fly */ - if( err == M4VSS3GPP_WAR_SWITCH_CLIP ) - { -#ifndef DO_NOT_REMOVE_TEMP_FILES - /* It means we can delete the temporary file */ - /* First step, check the temp file is not use somewhere else after */ - - M4OSA_UInt32 i; - M4OSA_Int32 cmpResult = -1; - - for ( i = pVSSContext->uiCurrentClip; - i < pVSSContext->uiClipNumber; i++ ) - { - if( pVSSContext->pClipList[pVSSContext->uiCurrentClip - - 1].filePathSize - == pVSSContext->pClipList[i].filePathSize ) - { - cmpResult = memcmp((void *)pVSSContext-> - pClipList[pVSSContext->uiCurrentClip - - 1].pFile, (void *)pVSSContext->pClipList[i].pFile, - pVSSContext-> - pClipList[pVSSContext->uiCurrentClip - - 1].filePathSize); - - if( cmpResult == 0 ) - { - /* It means we found a corresponding file, we do not delete - this temporary file */ - break; - } - } - } - - if( cmpResult != 0 ) - { - M4OSA_UInt32 ConvertedSize = 0; - M4OSA_Char *toto; - M4OSA_Char *pTmpStr; - - /* Convert result in UTF8 to check if we can delete it or not */ - if( xVSS_context->UTFConversionContext.pConvToUTF8Fct - != M4OSA_NULL && xVSS_context-> - UTFConversionContext. - pTempOutConversionBuffer != M4OSA_NULL ) - { - M4xVSS_internalConvertToUTF8(xVSS_context, - (M4OSA_Void *)pVSSContext-> - pClipList[pVSSContext->uiCurrentClip - - 1].pFile, (M4OSA_Void *)xVSS_context-> - UTFConversionContext. - pTempOutConversionBuffer, &ConvertedSize); - toto = (M4OSA_Char *)strstr((const char *)xVSS_context-> - UTFConversionContext. - pTempOutConversionBuffer, - (const char *)xVSS_context->pTempPath); - pTmpStr = - xVSS_context->UTFConversionContext. - pTempOutConversionBuffer; - } - else - { - toto = (M4OSA_Char *)strstr((const char *)pVSSContext-> - pClipList[pVSSContext->uiCurrentClip - - 1].pFile, (const char *)xVSS_context->pTempPath); - pTmpStr = pVSSContext-> - pClipList[pVSSContext->uiCurrentClip - - 1].pFile; - } - - if( toto != M4OSA_NULL ) - { - /* As temporary files can be imgXXX.3gp or vidXXX.3gp */ - pTmpStr += - (strlen((const char *)pTmpStr) - - 10); /* Because temporary files have a length at most of - 10 bytes */ - toto = (M4OSA_Char *)strstr((const char *)pTmpStr, - (const char *)"img"); - - if( toto != M4OSA_NULL ) - { - toto = (M4OSA_Char *)strstr((const char *)pTmpStr, - (const char *)"vid"); - } - - if( err - == M4NO_ERROR ) /* It means the file is a temporary file, we - can delete it */ - { - remove((const char *)pVSSContext-> - pClipList[pVSSContext->uiCurrentClip - - 1].pFile); - } - } - } - -#endif /* DO_NOT_REMOVE_TEMP_FILES*/ - /* */ - - err = M4NO_ERROR; - } - - if( err == M4VSS3GPP_WAR_EDITING_DONE ) - { - xVSS_context->currentStep++; - /* P4ME00003276: When a step is complete, increment currentStep and reset - uiProgress unless progress would be wrong */ - uiProgress = 0; - err = M4xVSS_internalCloseEditedFile(xVSS_context); - /* Fix for blrnxpsw#234---> */ - if( err != M4NO_ERROR ) - { - if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) ) - { - err = M4xVSSERR_NO_MORE_SPACE; - } - M4OSA_TRACE1_1( - "M4xVSS_internalCloseEditedFile returned an error: 0x%x", - err); - return err; - } - /*<---- Fix for blrnxpsw#234 */ - if( xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack - != M4OSA_NULL ) - { - xVSS_context->editingStep = - M4xVSS_kMicroStateAudioMixing; - /* Open Audio mixing component */ - err = M4xVSS_internalGenerateAudioMixFile(xVSS_context); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_internalGenerateAudioMixFile returned an error: 0x%x", - err); - /* TODO ? : Translate error code of VSS to an xVSS error code */ - return err; - } - err = M4NO_ERROR; - goto end_step; - } - else - { - - err = M4VSS3GPP_WAR_SAVING_DONE; - goto end_step; - - } - } - } - else if( xVSS_context->editingStep - == M4xVSS_kMicroStateAudioMixing ) /* Audio mixing: mix/replace audio track - with given BGM */ - { - err = M4VSS3GPP_audioMixingStep(pAudioMixingCtxt, &uiProgress); - - if( ( err != M4NO_ERROR) - && (err != M4VSS3GPP_WAR_END_OF_AUDIO_MIXING) ) - { - M4OSA_TRACE1_1( - "M4VSS3GPP_audioMixingMain: M4VSS3GPP_audioMixingStep returned 0x%x\n", - err); - /* TODO ? : Translate error code of VSS to an xVSS error code */ - return err; - } - - if( err == M4VSS3GPP_WAR_END_OF_AUDIO_MIXING ) - { - xVSS_context->currentStep++; - /* P4ME00003276: When a step is complete, increment currentStep and reset - uiProgress unless progress would be wrong */ - uiProgress = 0; - err = M4xVSS_internalCloseAudioMixedFile(xVSS_context); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1( - "M4xVSS_internalCloseAudioMixedFile returned an error: 0x%x", - err); - /* TODO ? : Translate error code of VSS to an xVSS error code */ - return err; - } - - err = M4VSS3GPP_WAR_SAVING_DONE; - goto end_step; - - } - } - else - { - M4OSA_TRACE1_0("Bad state in step function !"); - return M4ERR_STATE; - } - } - break; - - case M4xVSS_kStateAnalyzing: - { - if( xVSS_context->analyseStep - == M4xVSS_kMicroStateAnalysePto3GPP ) /* Pto3GPP, analysing input parameters */ - { - if( xVSS_context->pPTo3GPPcurrentParams == M4OSA_NULL - && xVSS_context->pPTo3GPPparamsList != M4OSA_NULL ) - { - xVSS_context->pPTo3GPPcurrentParams = - xVSS_context-> - pPTo3GPPparamsList; /* Current Pto3GPP Parameter is the first element - of the list */ - } - else if( xVSS_context->pPTo3GPPcurrentParams != M4OSA_NULL - && xVSS_context->pPTo3GPPparamsList != M4OSA_NULL ) - { - xVSS_context->pPTo3GPPcurrentParams = - xVSS_context->pPTo3GPPcurrentParams-> - pNext; /* Current Pto3GPP Parameter is the next element of the list */ - - if( xVSS_context->pPTo3GPPcurrentParams - == M4OSA_NULL ) /* It means there is no next image to convert */ - { - /* We step to MCS phase */ - xVSS_context->analyseStep = - M4xVSS_kMicroStateAnalyzeMCS; - err = M4NO_ERROR; - goto end_step; - } - } - else if( xVSS_context->pPTo3GPPparamsList == M4OSA_NULL ) - { - xVSS_context->analyseStep = - M4xVSS_kMicroStateAnalyzeMCS; /* Change Analyzing micro state to - MCS phase */ - err = M4NO_ERROR; - goto end_step; - } - - /* Check if this file has to be converted or not */ - /* If not, we just return M4NO_ERROR, and go to next file */ - if( xVSS_context->pPTo3GPPcurrentParams->isCreated - == M4OSA_FALSE ) - { - /* Opening Pto3GPP */ - err = M4xVSS_internalStartConvertPictureTo3gp(xVSS_context); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1("M4xVSS_Step: M4xVSS_internalStartConvertPictureTo3gp \ - returned error: 0x%x", - err) - /* TODO ? : Translate error code of VSS to an xVSS error code */ - return err; - } - xVSS_context->analyseStep = - M4xVSS_kMicroStateConvertPto3GPP; - } - } - else if( xVSS_context->analyseStep - == M4xVSS_kMicroStateConvertPto3GPP ) /* Pto3GPP, converting */ - { - err = M4PTO3GPP_Step(xVSS_context->pM4PTO3GPP_Ctxt); - /* update progress bar */ - if(xVSS_context->pCallBackCtxt->m_NbImage > 1) - { - uiProgress = (xVSS_context->pCallBackCtxt->m_ImageCounter * 100) / (xVSS_context->pCallBackCtxt->m_NbImage -1); - } - - if( ( err != M4NO_ERROR) && (err - != ((M4OSA_UInt32)M4PTO3GPP_WAR_END_OF_PROCESSING)) ) - { - /* TO BE CHECKED NO LEAKS !!!!! */ - M4OSA_TRACE1_1( - "M4xVSS_Step: M4PTO3GPP_Step returned 0x%x\n", err); - /* TODO ? : Translate error code of VSS to an xVSS error code */ - return err; - } - else if( err - == ((M4OSA_UInt32)M4PTO3GPP_WAR_END_OF_PROCESSING) ) - { - xVSS_context->currentStep++; - /* P4ME00003276: When a step is complete, increment currentStep and reset - uiProgress unless progress would be wrong */ - uiProgress = 0; - xVSS_context->analyseStep = - M4xVSS_kMicroStateAnalysePto3GPP; /* We go back to analyze parameters - to see if there is a next file to convert */ - /* RC !!!!!!!! */ - xVSS_context->pPTo3GPPcurrentParams->isCreated = - M4OSA_TRUE; /* To avoid reconverting it if another SendCommand is - called */ - err = M4xVSS_internalStopConvertPictureTo3gp(xVSS_context); - /*SS:blrnxpsw# 234 */ - if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) ) - { - err = M4xVSSERR_NO_MORE_SPACE; - } - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1("M4xVSS_Step:\ - M4xVSS_internalStopConvertPictureTo3gp returned 0x%x", - err); - /* TODO ? : Translate error code of VSS to an xVSS error code */ - return err; - } - } - } - else if( xVSS_context->analyseStep - == - M4xVSS_kMicroStateAnalyzeMCS ) /* MCS: analyzing input parameters */ - { - if( xVSS_context->pMCScurrentParams == M4OSA_NULL \ - && xVSS_context->pMCSparamsList != M4OSA_NULL ) - { - xVSS_context->pMCScurrentParams = xVSS_context-> - pMCSparamsList; /* Current MCS Parameter is the first - element of the list */ - } - else if( xVSS_context->pMCScurrentParams != M4OSA_NULL \ - && xVSS_context->pMCSparamsList != M4OSA_NULL ) - { - xVSS_context->pMCScurrentParams = - xVSS_context->pMCScurrentParams-> - pNext; /* Current MCS Parameter - is the next element of the list */ - - if( xVSS_context->pMCScurrentParams == M4OSA_NULL ) - /* It means there is no next image to convert */ - { - xVSS_context->analyseStep = - M4xVSS_kMicroStateAnalysePto3GPP; /* Reinit Analyzing micro state */ - xVSS_context->m_state = - M4xVSS_kStateOpened; /* Change xVSS state */ - err = M4VSS3GPP_WAR_ANALYZING_DONE; - goto end_step; /* End of Analysis */ - } - } - else if( xVSS_context->pMCSparamsList == M4OSA_NULL ) - { - xVSS_context->analyseStep = - M4xVSS_kMicroStateAnalysePto3GPP; /* Reinit Analyzing micro state */ - xVSS_context->m_state = - M4xVSS_kStateOpened; /* Change xVSS state */ - err = M4VSS3GPP_WAR_ANALYZING_DONE; - goto end_step; /* End of Analysis */ - } - - /* Check if this file has to be transcoded or not */ - /* If not, we just return M4NO_ERROR, and go to next file */ - if( xVSS_context->pMCScurrentParams->isCreated == M4OSA_FALSE ) - { - /* Opening MCS */ - M4OSA_UInt32 rotationDegree = 0; - err = M4xVSS_internalStartTranscoding(xVSS_context, &rotationDegree); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1("M4xVSS_Step: M4xVSS_internalStartTranscoding returned\ - error: 0x%x", err); - return err; - } - int32_t index = xVSS_context->pMCScurrentParams->videoclipnumber; - - /* The cuts are done in the MCS, so we need to replace - the beginCutTime and endCutTime to keep the entire video*/ - xVSS_context->pSettings->pClipList[index]->uiBeginCutTime = 0; - xVSS_context->pSettings->pClipList[index]->uiEndCutTime = 0; - - - M4OSA_TRACE1_1("M4xVSS_Step: \ - M4xVSS_internalStartTranscoding returned \ - success; MCS context: 0x%x", - xVSS_context->pMCS_Ctxt); - xVSS_context->analyseStep = - M4xVSS_kMicroStateTranscodeMCS; - - // Retain rotation info of trimmed / transcoded file - xVSS_context->pSettings->pClipList[index]->\ - ClipProperties.videoRotationDegrees = rotationDegree; - } - } - else if( xVSS_context->analyseStep - == M4xVSS_kMicroStateTranscodeMCS ) - /* MCS: transcoding file */ - { - err = M4MCS_step(xVSS_context->pMCS_Ctxt, &uiProgress); - /*SS:blrnxpsw# 234 */ - if( err == ((M4OSA_UInt32)M4MCS_ERR_NOMORE_SPACE) ) - { - err = M4xVSSERR_NO_MORE_SPACE; - } - - if( ( err != M4NO_ERROR) - && (err != M4MCS_WAR_TRANSCODING_DONE) ) - { - /* TO BE CHECKED NO LEAKS !!!!! */ - M4OSA_TRACE1_1("M4xVSS_Step: M4MCS_step returned 0x%x\n", - err); - /* TODO ? : Translate error code of MCS to an xVSS error code ? */ - return err; - } - else if( err == M4MCS_WAR_TRANSCODING_DONE ) - { - xVSS_context->currentStep++; - /* P4ME00003276: When a step is complete, increment currentStep and reset - uiProgress unless progress would be wrong */ - uiProgress = 0; - xVSS_context->analyseStep = - M4xVSS_kMicroStateAnalyzeMCS; /* We go back to - analyze parameters to see if there is - a next file to transcode */ - /* RC !!!!!!!!!*/ - xVSS_context->pMCScurrentParams->isCreated = - M4OSA_TRUE; /* To avoid - reconverting it if another SendCommand is called */ - err = M4xVSS_internalStopTranscoding(xVSS_context); - - if( err != M4NO_ERROR ) - { - M4OSA_TRACE1_1("M4xVSS_Step:\ - M4xVSS_internalStopTranscoding returned 0x%x", err); - /* TODO ? : Translate error code of MCS to an xVSS error code ? */ - return err; - } - } - } - else - { - M4OSA_TRACE1_0("Bad micro state in analyzing state") - return M4ERR_STATE; - } - } - break; - - default: - M4OSA_TRACE1_1( - "Bad state when calling M4xVSS_Step function! State is %d", - xVSS_context->m_state); - return M4ERR_STATE; - } - -end_step: - /* Compute progression */ - if( xVSS_context->nbStepTotal != 0 ) - { - *pProgress = (M4OSA_UInt8)(( ( xVSS_context->currentStep * 100) \ - / (xVSS_context->nbStepTotal)) - + (uiProgress / (xVSS_context->nbStepTotal))); - - if( *pProgress > 100 ) - { - *pProgress = 100; - } - } - else - { - *pProgress = 100; - } - - return err; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_CloseCommand(M4OSA_Context pContext) - * @brief This function deletes current editing profile, unallocate - * ressources and change xVSS internal state. - * @note After this function, the user can call a new M4xVSS_SendCommand - * - * @param pContext (IN) Pointer on the xVSS edit context - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_STATE: This function cannot not be called at this time - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_CloseCommand( M4OSA_Context pContext ) -{ - M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext; - M4OSA_ERR err = M4NO_ERROR; - - /* Check state */ - /* Depending of the state, differents things have to be done */ - switch( xVSS_context->m_state ) - { - case M4xVSS_kStateOpened: - /* Nothing to do here */ - err = M4xVSS_internalFreeSaving(xVSS_context); - break; - - case M4xVSS_kStateSaving: - { - if( xVSS_context->editingStep == M4xVSS_kMicroStateEditing ) - { - err = M4xVSS_internalCloseEditedFile(xVSS_context); - - if( err != M4NO_ERROR ) - { - /* Fix for blrnxpsw#234---->*/ - if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) ) - { - err = M4xVSSERR_NO_MORE_SPACE; - } - M4OSA_TRACE1_1("M4xVSS_CloseCommand:\ - M4xVSS_internalCloseEditedFile returned an error: 0x%x", - err); - /* we are retaining error here and returning error in the end of the - function as to aviod memory leak*/ - //return err; - } - } - else if( xVSS_context->editingStep - == M4xVSS_kMicroStateAudioMixing ) - { - err = M4xVSS_internalCloseAudioMixedFile(xVSS_context); - - if( err != M4NO_ERROR ) - { - /* Fix for blrnxpsw#234---->*/ - if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) ) - { - err = M4xVSSERR_NO_MORE_SPACE; - } - M4OSA_TRACE1_1("M4xVSS_CloseCommand: \ - M4xVSS_internalCloseAudioMixedFile returned an error: 0x%x", err); - /* we are retaining error here and returning error in the end of - the function as to aviod memory leak*/ - //return err; - /* <----Fix for blrnxpsw#234*/ - } - } - err = M4xVSS_internalFreeSaving(xVSS_context); - /* We free this pointer only if a BGM track is present, because in that case, - this pointer owns to us */ - if( xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL ) { - /*if(M4OSA_NULL != xVSS_context->pSettings->pOutputFile) - { - free(xVSS_context->pSettings->pOutputFile); - xVSS_context->pSettings->pOutputFile = M4OSA_NULL; - }*/ - /*if(M4OSA_NULL != xVSS_context->pSettings->pTemporaryFile) - { - free(xVSS_context->pSettings->pTemporaryFile); - xVSS_context->pSettings->pTemporaryFile = M4OSA_NULL; - }*/ - } - } - break; - - case M4xVSS_kStateSaved: - break; - - case M4xVSS_kStateAnalyzing: - { - if( xVSS_context->analyseStep == M4xVSS_kMicroStateConvertPto3GPP ) - { - /* Free Pto3GPP module */ - err = M4xVSS_internalStopConvertPictureTo3gp(xVSS_context); - /* Fix for blrnxpsw#234---->*/ - if( err != M4NO_ERROR ) - { - if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) ) - { - err = M4xVSSERR_NO_MORE_SPACE; - } - M4OSA_TRACE1_1("M4xVSS_Step: \ - M4xVSS_internalStopConvertPictureTo3gp returned 0x%x", err); - /* we are retaining error here and returning error in the end of the - function as to aviod memory leak*/ - //return err; - } - /* <-----Fix for blrnxpsw#234>*/ - } - else if( xVSS_context->analyseStep - == M4xVSS_kMicroStateTranscodeMCS ) - { - /* Free MCS module */ - err = M4MCS_abort(xVSS_context->pMCS_Ctxt); - /* Fix for blrnxpsw#234---->*/ - if( err != M4NO_ERROR ) - { - if( err == ((M4OSA_UInt32)M4ERR_FILE_INVALID_POSITION) ) - { - err = M4xVSSERR_NO_MORE_SPACE; - } - M4OSA_TRACE1_1("M4xVSS_Step: M4MCS_abort returned 0x%x", - err); - /* we are retaining error here and returning error in the end of the - function as to aviod memory leak*/ - //return err; - } - /* <---Fix for blrnxpsw#234*/ - } - } - break; - - default: - M4OSA_TRACE1_1( - "Bad state when calling M4xVSS_CloseCommand function! State is %d", - xVSS_context->m_state); - return M4ERR_STATE; - } - - /* Free Send command */ - M4xVSS_freeCommand(xVSS_context); - - xVSS_context->m_state = M4xVSS_kStateInitialized; /* Change xVSS state */ - - return err; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_CleanUp(M4OSA_Context pContext) - * @brief This function deletes all xVSS ressources - * @note This function must be called after M4xVSS_CloseCommand. - * - * @param pContext (IN) Pointer on the xVSS edit context - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_STATE: This function cannot not be called at this time - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_CleanUp( M4OSA_Context pContext ) -{ - M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext; - M4OSA_TRACE3_0("M4xVSS_CleanUp:entering"); - - /* Check state */ - if( xVSS_context->m_state != M4xVSS_kStateInitialized ) - { - M4OSA_TRACE1_1(\ - "Bad state when calling M4xVSS_CleanUp function! State is %d",\ - xVSS_context->m_state); - return M4ERR_STATE; - } - - /** - * UTF conversion: free temporary buffer*/ - if( xVSS_context->UTFConversionContext.pTempOutConversionBuffer - != M4OSA_NULL ) - { - free(xVSS_context-> - UTFConversionContext.pTempOutConversionBuffer); - xVSS_context->UTFConversionContext.pTempOutConversionBuffer = - M4OSA_NULL; - } - - free(xVSS_context->pTempPath); - xVSS_context->pTempPath = M4OSA_NULL; - - free(xVSS_context->pSettings); - xVSS_context->pSettings = M4OSA_NULL; - - free(xVSS_context); - xVSS_context = M4OSA_NULL; - M4OSA_TRACE3_0("M4xVSS_CleanUp:leaving "); - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * prototype M4xVSS_GetVersion(M4_VersionInfo *pVersion) - * @brief This function get the version of the Video Studio 2.1 - * - * @param pVersion (IN) Pointer on the version info struct - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_GetVersion( M4_VersionInfo *pVersion ) -{ - /* Just used for a grep in code */ - /* CHANGE_VERSION_HERE */ - static const M4OSA_Char cVersion[26] = "NXPSW_VideoStudio21_1_3_0"; - - if( M4OSA_NULL == pVersion ) - { - return M4ERR_PARAMETER; - } - - pVersion->m_major = M4_xVSS_MAJOR; - pVersion->m_minor = M4_xVSS_MINOR; - pVersion->m_revision = M4_xVSS_REVISION; - pVersion->m_structSize = sizeof(M4_VersionInfo); - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4xVSS_CreateClipSettings() - * @brief Allows filling a clip settings structure with default values - * - * @note WARNING: pClipSettings->Effects[ ] will be allocated in this function. - * pClipSettings->pFile will be allocated in this function. - * - * @param pClipSettings (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure - * @param pFile (IN) Clip file name - * @param filePathSize (IN) Size of the clip path (needed for the UTF16 conversion) - * @param nbEffects (IN) Nb of effect settings to allocate - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pClipSettings is M4OSA_NULL (debug only) - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_CreateClipSettings( M4VSS3GPP_ClipSettings *pClipSettings, - M4OSA_Void *pFile, M4OSA_UInt32 filePathSize, - M4OSA_UInt8 nbEffects ) -{ - M4OSA_ERR err = M4NO_ERROR; - - M4OSA_TRACE3_1("M4xVSS_CreateClipSettings called with pClipSettings=0x%p", - pClipSettings); - - /** - * Check input parameter */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettings), M4ERR_PARAMETER, - "M4xVSS_CreateClipSettings: pClipSettings is NULL"); - - /* Create inherited VSS3GPP stuff */ - /*err = M4VSS3GPP_editCreateClipSettings(pClipSettings, pFile,nbEffects);*/ - /*FB: add clip path size (needed for UTF 16 conversion)*/ - err = M4VSS3GPP_editCreateClipSettings(pClipSettings, pFile, filePathSize, - nbEffects); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1("M4xVSS_CreateClipSettings :\ - ERROR in M4VSS3GPP_editCreateClipSettings = 0x%x", err); - return err; - } - - /* Set the clip settings to default */ - pClipSettings->xVSS.uiBeginCutPercent = 0; - pClipSettings->xVSS.uiEndCutPercent = 0; - pClipSettings->xVSS.uiDuration = 0; - pClipSettings->xVSS.isPanZoom = M4OSA_FALSE; - pClipSettings->xVSS.PanZoomTopleftXa = 0; - pClipSettings->xVSS.PanZoomTopleftYa = 0; - pClipSettings->xVSS.PanZoomTopleftXb = 0; - pClipSettings->xVSS.PanZoomTopleftYb = 0; - pClipSettings->xVSS.PanZoomXa = 0; - pClipSettings->xVSS.PanZoomXb = 0; - - /** - * Return with no error */ - M4OSA_TRACE3_0("M4xVSS_CreateClipSettings(): returning M4NO_ERROR"); - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4xVSS_DuplicateClipSettings() - * @brief Duplicates a clip settings structure, performing allocations if required - * - * @param pClipSettingsDest (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure - * @param pClipSettingsOrig (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure - * @param bCopyEffects (IN) Flag to know if we have to duplicate effects - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pClipSettings is M4OSA_NULL (debug only) - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_DuplicateClipSettings( M4VSS3GPP_ClipSettings - *pClipSettingsDest, - M4VSS3GPP_ClipSettings *pClipSettingsOrig, - M4OSA_Bool bCopyEffects ) -{ - M4OSA_ERR err = M4NO_ERROR; - - M4OSA_TRACE3_2( - "M4xVSS_DuplicateClipSettings called with dest=0x%p src=0x%p", - pClipSettingsDest, pClipSettingsOrig); - - /* Check input parameter */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettingsDest), M4ERR_PARAMETER, - "M4xVSS_DuplicateClipSettings: pClipSettingsDest is NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettingsOrig), M4ERR_PARAMETER, - "M4xVSS_DuplicateClipSettings: pClipSettingsOrig is NULL"); - - /* Call inherited VSS3GPP duplication */ - err = M4VSS3GPP_editDuplicateClipSettings(pClipSettingsDest, - pClipSettingsOrig, bCopyEffects); - - if( M4NO_ERROR != err ) - { - M4OSA_TRACE1_1("M4xVSS_CreateClipSettings :\ - ERROR in M4VSS3GPP_editDuplicateClipSettings = 0x%x", err); - return err; - } - - /* Return with no error */ - M4OSA_TRACE3_0("M4xVSS_DuplicateClipSettings(): returning M4NO_ERROR"); - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4xVSS_FreeClipSettings() - * @brief Free the pointers allocated in the ClipSetting structure (pFile, Effects, ...). - * - * @param pClipSettings (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: pClipSettings is M4OSA_NULL (debug only) - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_FreeClipSettings( M4VSS3GPP_ClipSettings *pClipSettings ) -{ - /** - * Check input parameter */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pClipSettings), M4ERR_PARAMETER, - "M4xVSS_FreeClipSettings: pClipSettings is NULL"); - - /* Free inherited VSS3GPP stuff */ - M4VSS3GPP_editFreeClipSettings(pClipSettings); - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_getMCSContext(M4OSA_Context pContext, M4OSA_Context* mcsContext) - * @brief This function returns the MCS context within the xVSS internal context - * @note This function must be called only after VSS state has moved to analyzing state or - * beyond - * - * @param pContext (IN) Pointer on the xVSS edit context - * @param mcsContext (OUT) Pointer to pointer of mcs context to return - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_STATE: This function cannot not be called at this time - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_getMCSContext( M4OSA_Context pContext, - M4OSA_Context *mcsContext ) -{ - M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext; - M4OSA_ERR err = M4NO_ERROR; - - /** - * Check input parameter */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER, - "M4xVSS_getMCSContext: pContext is NULL"); - - if( xVSS_context->m_state == M4xVSS_kStateInitialized ) - { - M4OSA_TRACE1_1("M4xVSS_getMCSContext: Bad state! State is %d",\ - xVSS_context->m_state); - return M4ERR_STATE; - } - - *mcsContext = xVSS_context->pMCS_Ctxt; - - return err; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_getVSS3GPPContext(M4OSA_Context pContext, - * M4OSA_Context* mcsContext) - * @brief This function returns the VSS3GPP context within the xVSS internal context - * @note This function must be called only after VSS state has moved to Generating preview - * or beyond - * @param pContext (IN) Pointer on the xVSS edit context - * @param vss3gppContext (OUT) Pointer to pointer of vss3gpp context to return - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_STATE: This function cannot not be called at this time - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_getVSS3GPPContext( M4OSA_Context pContext, - M4OSA_Context *vss3gppContext ) -{ - M4xVSS_Context *xVSS_context = (M4xVSS_Context *)pContext; - M4OSA_ERR err = M4NO_ERROR; - - /** - * Check input parameter */ - M4OSA_DEBUG_IF2((M4OSA_NULL == pContext), M4ERR_PARAMETER, - "M4xVSS_getVSS3GPPContext: pContext is NULL"); - - if( xVSS_context->m_state < M4xVSS_kStateSaving ) - { - M4OSA_TRACE1_1("M4xVSS_getVSS3GPPContext: Bad state! State is %d",\ - xVSS_context->m_state); - return M4ERR_STATE; - } - - *vss3gppContext = xVSS_context->pCurrentEditContext; - - return err; -} - -M4OSA_ERR M4xVSS_getVideoDecoderCapabilities(M4DECODER_VideoDecoders **decoders) { - M4OSA_ERR err = M4NO_ERROR; - - // Call the decoder api directly - // to get all the video decoder capablities. - err = VideoEditorVideoDecoder_getVideoDecodersAndCapabilities(decoders); - return err; -} diff --git a/libvideoeditor/vss/src/M4xVSS_internal.c b/libvideoeditor/vss/src/M4xVSS_internal.c deleted file mode 100755 index 84959ec..0000000 --- a/libvideoeditor/vss/src/M4xVSS_internal.c +++ /dev/null @@ -1,4889 +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 M4xVSS_internal.c - * @brief Internal functions of extended Video Studio Service (Video Studio 2.1) - * @note - ****************************************************************************** - */ -#include "M4OSA_Debug.h" -#include "M4OSA_CharStar.h" - -#include "NXPSW_CompilerSwitches.h" - -#include "M4VSS3GPP_API.h" -#include "M4VSS3GPP_ErrorCodes.h" - -#include "M4xVSS_API.h" -#include "M4xVSS_Internal.h" - -/*for rgb16 color effect*/ -#include "M4VIFI_Defines.h" -#include "M4VIFI_Clip.h" - -/** - * component includes */ -#include "M4VFL_transition.h" /**< video effects */ - -/* Internal header file of VSS is included because of MMS use case */ -#include "M4VSS3GPP_InternalTypes.h" - -/*Exif header files to add image rendering support (cropping, black borders)*/ -#include "M4EXIFC_CommonAPI.h" -// StageFright encoders require %16 resolution -#include "M4ENCODER_common.h" - -#define TRANSPARENT_COLOR 0x7E0 - -/* Prototype of M4VIFI_xVSS_RGB565toYUV420 function (avoid green effect of transparency color) */ -M4VIFI_UInt8 M4VIFI_xVSS_RGB565toYUV420(void *pUserData, M4VIFI_ImagePlane *pPlaneIn, - M4VIFI_ImagePlane *pPlaneOut); - - -/*special MCS function used only in VideoArtist and VideoStudio to open the media in the normal - mode. That way the media duration is accurate*/ -extern M4OSA_ERR M4MCS_open_normalMode(M4MCS_Context pContext, M4OSA_Void* pFileIn, - M4VIDEOEDITING_FileType InputFileType, - M4OSA_Void* pFileOut, M4OSA_Void* pTempFile); - - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalStartTranscoding(M4OSA_Context pContext) - * @brief This function initializes MCS (3GP transcoder) with the given - * parameters - * @note The transcoding parameters are given by the internal xVSS context. - * This context contains a pointer on the current element of the - * chained list of MCS parameters. - * - * @param pContext (IN) Pointer on the xVSS edit context - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_ALLOC: Memory allocation has failed - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalStartTranscoding(M4OSA_Context pContext, - M4OSA_UInt32 *rotationDegree) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4OSA_ERR err; - M4MCS_Context mcs_context; - M4MCS_OutputParams Params; - M4MCS_EncodingParams Rates; - M4OSA_UInt32 i; - M4VIDEOEDITING_ClipProperties clipProps; - - err = M4MCS_init(&mcs_context, xVSS_context->pFileReadPtr, xVSS_context->pFileWritePtr); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("Error in M4MCS_init: 0x%x", err); - return err; - } - - err = M4MCS_open(mcs_context, xVSS_context->pMCScurrentParams->pFileIn, - xVSS_context->pMCScurrentParams->InputFileType, - xVSS_context->pMCScurrentParams->pFileOut, - xVSS_context->pMCScurrentParams->pFileTemp); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("Error in M4MCS_open: 0x%x", err); - M4MCS_abort(mcs_context); - return err; - } - - /** Get the clip properties - */ - err = M4MCS_getInputFileProperties(mcs_context, &clipProps); - if (err != M4NO_ERROR) { - M4OSA_TRACE1_1("Error in M4MCS_getInputFileProperties: 0x%x", err); - M4MCS_abort(mcs_context); - return err; - } - *rotationDegree = clipProps.videoRotationDegrees; - - /** - * Fill MCS parameters with the parameters contained in the current element of the - MCS parameters chained list */ - Params.OutputFileType = xVSS_context->pMCScurrentParams->OutputFileType; - Params.OutputVideoFormat = xVSS_context->pMCScurrentParams->OutputVideoFormat; - Params.outputVideoProfile= xVSS_context->pMCScurrentParams->outputVideoProfile; - Params.outputVideoLevel = xVSS_context->pMCScurrentParams->outputVideoLevel; - Params.OutputVideoFrameSize = xVSS_context->pMCScurrentParams->OutputVideoFrameSize; - Params.OutputVideoFrameRate = xVSS_context->pMCScurrentParams->OutputVideoFrameRate; - Params.OutputAudioFormat = xVSS_context->pMCScurrentParams->OutputAudioFormat; - Params.OutputAudioSamplingFrequency = - xVSS_context->pMCScurrentParams->OutputAudioSamplingFrequency; - Params.bAudioMono = xVSS_context->pMCScurrentParams->bAudioMono; - Params.pOutputPCMfile = M4OSA_NULL; - /*FB 2008/10/20: add media rendering parameter to keep aspect ratio*/ - switch(xVSS_context->pMCScurrentParams->MediaRendering) - { - case M4xVSS_kResizing: - Params.MediaRendering = M4MCS_kResizing; - break; - case M4xVSS_kCropping: - Params.MediaRendering = M4MCS_kCropping; - break; - case M4xVSS_kBlackBorders: - Params.MediaRendering = M4MCS_kBlackBorders; - break; - default: - break; - } - /**/ - // new params after integrating MCS 2.0 - // Set the number of audio effects; 0 for now. - Params.nbEffects = 0; - - // Set the audio effect; null for now. - Params.pEffects = NULL; - - // Set the audio effect; null for now. - Params.bDiscardExif = M4OSA_FALSE; - - // Set the audio effect; null for now. - Params.bAdjustOrientation = M4OSA_FALSE; - // new params after integrating MCS 2.0 - - /** - * Set output parameters */ - err = M4MCS_setOutputParams(mcs_context, &Params); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("Error in M4MCS_setOutputParams: 0x%x", err); - M4MCS_abort(mcs_context); - return err; - } - - Rates.OutputVideoBitrate = xVSS_context->pMCScurrentParams->OutputVideoBitrate; - Rates.OutputAudioBitrate = xVSS_context->pMCScurrentParams->OutputAudioBitrate; - Rates.BeginCutTime = 0; - Rates.EndCutTime = 0; - Rates.OutputFileSize = 0; - - /*FB: transcoding per parts*/ - Rates.BeginCutTime = xVSS_context->pMCScurrentParams->BeginCutTime; - Rates.EndCutTime = xVSS_context->pMCScurrentParams->EndCutTime; - Rates.OutputVideoTimescale = xVSS_context->pMCScurrentParams->OutputVideoTimescale; - - err = M4MCS_setEncodingParams(mcs_context, &Rates); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("Error in M4MCS_setEncodingParams: 0x%x", err); - M4MCS_abort(mcs_context); - return err; - } - - err = M4MCS_checkParamsAndStart(mcs_context); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("Error in M4MCS_checkParamsAndStart: 0x%x", err); - M4MCS_abort(mcs_context); - return err; - } - - /** - * Save MCS context to be able to call MCS step function in M4xVSS_step function */ - xVSS_context->pMCS_Ctxt = mcs_context; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalStopTranscoding(M4OSA_Context pContext) - * @brief This function cleans up MCS (3GP transcoder) - * @note - * - * @param pContext (IN) Pointer on the xVSS edit context - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL - * @return M4ERR_ALLOC: Memory allocation has failed - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalStopTranscoding(M4OSA_Context pContext) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4OSA_ERR err; - - err = M4MCS_close(xVSS_context->pMCS_Ctxt); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalStopTranscoding: Error in M4MCS_close: 0x%x", err); - M4MCS_abort(xVSS_context->pMCS_Ctxt); - return err; - } - - /** - * Free this MCS instance */ - err = M4MCS_cleanUp(xVSS_context->pMCS_Ctxt); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalStopTranscoding: Error in M4MCS_cleanUp: 0x%x", err); - return err; - } - - xVSS_context->pMCS_Ctxt = M4OSA_NULL; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4xVSS_internalConvertAndResizeARGB8888toYUV420(M4OSA_Void* pFileIn, - * M4OSA_FileReadPointer* pFileReadPtr, - * M4VIFI_ImagePlane* pImagePlanes, - * M4OSA_UInt32 width, - * M4OSA_UInt32 height); - * @brief It Coverts and resizes a ARGB8888 image to YUV420 - * @note - * @param pFileIn (IN) The Image input file - * @param pFileReadPtr (IN) Pointer on filesystem functions - * @param pImagePlanes (IN/OUT) Pointer on YUV420 output planes allocated by the user - * ARGB8888 image will be converted and resized to output - * YUV420 plane size - *@param width (IN) width of the ARGB8888 - *@param height (IN) height of the ARGB8888 - * @return M4NO_ERROR: No error - * @return M4ERR_ALLOC: memory error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ - -M4OSA_ERR M4xVSS_internalConvertAndResizeARGB8888toYUV420(M4OSA_Void* pFileIn, - M4OSA_FileReadPointer* pFileReadPtr, - M4VIFI_ImagePlane* pImagePlanes, - M4OSA_UInt32 width,M4OSA_UInt32 height) -{ - M4OSA_Context pARGBIn; - M4VIFI_ImagePlane rgbPlane1 ,rgbPlane2; - M4OSA_UInt32 frameSize_argb=(width * height * 4); - M4OSA_UInt32 frameSize = (width * height * 3); //Size of RGB888 data. - M4OSA_UInt32 i = 0,j= 0; - M4OSA_ERR err=M4NO_ERROR; - - - M4OSA_UInt8 *pTmpData = (M4OSA_UInt8*) M4OSA_32bitAlignedMalloc(frameSize_argb, - M4VS, (M4OSA_Char*)"Image argb data"); - M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 Entering :"); - if(pTmpData == M4OSA_NULL) { - M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 :\ - Failed to allocate memory for Image clip"); - return M4ERR_ALLOC; - } - - M4OSA_TRACE1_2("M4xVSS_internalConvertAndResizeARGB8888toYUV420 :width and height %d %d", - width ,height); - /* Get file size (mandatory for chunk decoding) */ - err = pFileReadPtr->openRead(&pARGBIn, pFileIn, M4OSA_kFileRead); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_2("M4xVSS_internalConvertAndResizeARGB8888toYUV420 :\ - Can't open input ARGB8888 file %s, error: 0x%x\n",pFileIn, err); - free(pTmpData); - pTmpData = M4OSA_NULL; - goto cleanup; - } - - err = pFileReadPtr->readData(pARGBIn,(M4OSA_MemAddr8)pTmpData, &frameSize_argb); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_2("M4xVSS_internalConvertAndResizeARGB8888toYUV420 Can't close ARGB8888\ - file %s, error: 0x%x\n",pFileIn, err); - pFileReadPtr->closeRead(pARGBIn); - free(pTmpData); - pTmpData = M4OSA_NULL; - goto cleanup; - } - - err = pFileReadPtr->closeRead(pARGBIn); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_2("M4xVSS_internalConvertAndResizeARGB8888toYUV420 Can't close ARGB8888 \ - file %s, error: 0x%x\n",pFileIn, err); - free(pTmpData); - pTmpData = M4OSA_NULL; - goto cleanup; - } - - rgbPlane1.pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(frameSize, M4VS, - (M4OSA_Char*)"Image clip RGB888 data"); - if(rgbPlane1.pac_data == M4OSA_NULL) - { - M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 \ - Failed to allocate memory for Image clip"); - free(pTmpData); - return M4ERR_ALLOC; - } - - rgbPlane1.u_height = height; - rgbPlane1.u_width = width; - rgbPlane1.u_stride = width*3; - rgbPlane1.u_topleft = 0; - - - /** Remove the alpha channel */ - for (i=0, j = 0; i < frameSize_argb; i++) { - if ((i % 4) == 0) continue; - rgbPlane1.pac_data[j] = pTmpData[i]; - j++; - } - free(pTmpData); - - /* To Check if resizing is required with color conversion */ - if(width != pImagePlanes->u_width || height != pImagePlanes->u_height) - { - M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 Resizing :"); - frameSize = ( pImagePlanes->u_width * pImagePlanes->u_height * 3); - rgbPlane2.pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(frameSize, M4VS, - (M4OSA_Char*)"Image clip RGB888 data"); - if(rgbPlane2.pac_data == M4OSA_NULL) - { - M4OSA_TRACE1_0("Failed to allocate memory for Image clip"); - free(pTmpData); - return M4ERR_ALLOC; - } - rgbPlane2.u_height = pImagePlanes->u_height; - rgbPlane2.u_width = pImagePlanes->u_width; - rgbPlane2.u_stride = pImagePlanes->u_width*3; - rgbPlane2.u_topleft = 0; - - /* Resizing RGB888 to RGB888 */ - err = M4VIFI_ResizeBilinearRGB888toRGB888(M4OSA_NULL, &rgbPlane1, &rgbPlane2); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("error when converting from Resize RGB888 to RGB888: 0x%x\n", err); - free(rgbPlane2.pac_data); - free(rgbPlane1.pac_data); - return err; - } - /*Converting Resized RGB888 to YUV420 */ - err = M4VIFI_RGB888toYUV420(M4OSA_NULL, &rgbPlane2, pImagePlanes); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("error when converting from RGB888 to YUV: 0x%x\n", err); - free(rgbPlane2.pac_data); - free(rgbPlane1.pac_data); - return err; - } - free(rgbPlane2.pac_data); - free(rgbPlane1.pac_data); - - M4OSA_TRACE1_0("RGB to YUV done"); - - - } - else - { - M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 NO Resizing :"); - err = M4VIFI_RGB888toYUV420(M4OSA_NULL, &rgbPlane1, pImagePlanes); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("error when converting from RGB to YUV: 0x%x\n", err); - } - free(rgbPlane1.pac_data); - - M4OSA_TRACE1_0("RGB to YUV done"); - } -cleanup: - M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 leaving :"); - return err; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4xVSS_internalConvertARGB8888toYUV420(M4OSA_Void* pFileIn, - * M4OSA_FileReadPointer* pFileReadPtr, - * M4VIFI_ImagePlane* pImagePlanes, - * M4OSA_UInt32 width, - * M4OSA_UInt32 height); - * @brief It Coverts a ARGB8888 image to YUV420 - * @note - * @param pFileIn (IN) The Image input file - * @param pFileReadPtr (IN) Pointer on filesystem functions - * @param pImagePlanes (IN/OUT) Pointer on YUV420 output planes allocated by the user - * ARGB8888 image will be converted and resized to output - * YUV420 plane size - * @param width (IN) width of the ARGB8888 - * @param height (IN) height of the ARGB8888 - * @return M4NO_ERROR: No error - * @return M4ERR_ALLOC: memory error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ - -M4OSA_ERR M4xVSS_internalConvertARGB8888toYUV420(M4OSA_Void* pFileIn, - M4OSA_FileReadPointer* pFileReadPtr, - M4VIFI_ImagePlane** pImagePlanes, - M4OSA_UInt32 width,M4OSA_UInt32 height) -{ - M4OSA_ERR err = M4NO_ERROR; - M4VIFI_ImagePlane *yuvPlane = M4OSA_NULL; - - yuvPlane = (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc(3*sizeof(M4VIFI_ImagePlane), - M4VS, (M4OSA_Char*)"M4xVSS_internalConvertRGBtoYUV: Output plane YUV"); - if(yuvPlane == M4OSA_NULL) { - M4OSA_TRACE1_0("M4xVSS_internalConvertAndResizeARGB8888toYUV420 :\ - Failed to allocate memory for Image clip"); - return M4ERR_ALLOC; - } - yuvPlane[0].u_height = height; - yuvPlane[0].u_width = width; - yuvPlane[0].u_stride = width; - yuvPlane[0].u_topleft = 0; - yuvPlane[0].pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(yuvPlane[0].u_height \ - * yuvPlane[0].u_width * 1.5, M4VS, (M4OSA_Char*)"imageClip YUV data"); - - yuvPlane[1].u_height = yuvPlane[0].u_height >>1; - yuvPlane[1].u_width = yuvPlane[0].u_width >> 1; - yuvPlane[1].u_stride = yuvPlane[1].u_width; - yuvPlane[1].u_topleft = 0; - yuvPlane[1].pac_data = (M4VIFI_UInt8*)(yuvPlane[0].pac_data + yuvPlane[0].u_height \ - * yuvPlane[0].u_width); - - yuvPlane[2].u_height = yuvPlane[0].u_height >>1; - yuvPlane[2].u_width = yuvPlane[0].u_width >> 1; - yuvPlane[2].u_stride = yuvPlane[2].u_width; - yuvPlane[2].u_topleft = 0; - yuvPlane[2].pac_data = (M4VIFI_UInt8*)(yuvPlane[1].pac_data + yuvPlane[1].u_height \ - * yuvPlane[1].u_width); - err = M4xVSS_internalConvertAndResizeARGB8888toYUV420( pFileIn,pFileReadPtr, - yuvPlane, width, height); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalConvertAndResizeARGB8888toYUV420 return error: 0x%x\n", err); - free(yuvPlane); - return err; - } - - *pImagePlanes = yuvPlane; - - M4OSA_TRACE1_0("M4xVSS_internalConvertARGB8888toYUV420 :Leaving"); - return err; - -} - -/** - ****************************************************************************** - * M4OSA_ERR M4xVSS_PictureCallbackFct (M4OSA_Void* pPictureCtxt, - * M4VIFI_ImagePlane* pImagePlanes, - * M4OSA_UInt32* pPictureDuration); - * @brief It feeds the PTO3GPP with YUV420 pictures. - * @note This function is given to the PTO3GPP in the M4PTO3GPP_Params structure - * @param pContext (IN) The integrator own context - * @param pImagePlanes(IN/OUT) Pointer to an array of three valid image planes - * @param pPictureDuration(OUT) Duration of the returned picture - * - * @return M4NO_ERROR: No error - * @return M4PTO3GPP_WAR_LAST_PICTURE: The returned image is the last one - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_PictureCallbackFct(M4OSA_Void* pPictureCtxt, M4VIFI_ImagePlane* pImagePlanes, - M4OSA_Double* pPictureDuration) -{ - M4OSA_ERR err = M4NO_ERROR; - M4OSA_UInt8 last_frame_flag = 0; - M4xVSS_PictureCallbackCtxt* pC = (M4xVSS_PictureCallbackCtxt*) (pPictureCtxt); - - /*Used for pan&zoom*/ - M4OSA_UInt8 tempPanzoomXa = 0; - M4OSA_UInt8 tempPanzoomXb = 0; - M4AIR_Params Params; - /**/ - - /*Used for cropping and black borders*/ - M4OSA_Context pPictureContext = M4OSA_NULL; - M4OSA_FilePosition pictureSize = 0 ; - M4OSA_UInt8* pictureBuffer = M4OSA_NULL; - //M4EXIFC_Context pExifContext = M4OSA_NULL; - M4EXIFC_BasicTags pBasicTags; - M4VIFI_ImagePlane pImagePlanes1 = pImagePlanes[0]; - M4VIFI_ImagePlane pImagePlanes2 = pImagePlanes[1]; - M4VIFI_ImagePlane pImagePlanes3 = pImagePlanes[2]; - /**/ - - /** - * Check input parameters */ - M4OSA_DEBUG_IF2((M4OSA_NULL==pPictureCtxt), M4ERR_PARAMETER, - "M4xVSS_PictureCallbackFct: pPictureCtxt is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL==pImagePlanes), M4ERR_PARAMETER, - "M4xVSS_PictureCallbackFct: pImagePlanes is M4OSA_NULL"); - M4OSA_DEBUG_IF2((M4OSA_NULL==pPictureDuration), M4ERR_PARAMETER, - "M4xVSS_PictureCallbackFct: pPictureDuration is M4OSA_NULL"); - M4OSA_TRACE1_0("M4xVSS_PictureCallbackFct :Entering"); - /*PR P4ME00003181 In case the image number is 0, pan&zoom can not be used*/ - if(M4OSA_TRUE == pC->m_pPto3GPPparams->isPanZoom && pC->m_NbImage == 0) - { - pC->m_pPto3GPPparams->isPanZoom = M4OSA_FALSE; - } - - /*If no cropping/black borders or pan&zoom, just decode and resize the picture*/ - if(pC->m_mediaRendering == M4xVSS_kResizing && M4OSA_FALSE == pC->m_pPto3GPPparams->isPanZoom) - { - /** - * Convert and resize input ARGB8888 file to YUV420 */ - /*To support ARGB8888 : */ - M4OSA_TRACE1_2("M4xVSS_PictureCallbackFct 1: width and heght %d %d", - pC->m_pPto3GPPparams->width,pC->m_pPto3GPPparams->height); - err = M4xVSS_internalConvertAndResizeARGB8888toYUV420(pC->m_FileIn, - pC->m_pFileReadPtr, pImagePlanes,pC->m_pPto3GPPparams->width, - pC->m_pPto3GPPparams->height); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct: Error when decoding JPEG: 0x%x\n", err); - return err; - } - } - /*In case of cropping, black borders or pan&zoom, call the EXIF reader and the AIR*/ - else - { - /** - * Computes ratios */ - if(pC->m_pDecodedPlane == M4OSA_NULL) - { - /** - * Convert input ARGB8888 file to YUV420 */ - M4OSA_TRACE1_2("M4xVSS_PictureCallbackFct 2: width and heght %d %d", - pC->m_pPto3GPPparams->width,pC->m_pPto3GPPparams->height); - err = M4xVSS_internalConvertARGB8888toYUV420(pC->m_FileIn, pC->m_pFileReadPtr, - &(pC->m_pDecodedPlane),pC->m_pPto3GPPparams->width,pC->m_pPto3GPPparams->height); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct: Error when decoding JPEG: 0x%x\n", err); - if(pC->m_pDecodedPlane != M4OSA_NULL) - { - /* YUV420 planar is returned but allocation is made only once - (contigous planes in memory) */ - if(pC->m_pDecodedPlane->pac_data != M4OSA_NULL) - { - free(pC->m_pDecodedPlane->pac_data); - } - free(pC->m_pDecodedPlane); - pC->m_pDecodedPlane = M4OSA_NULL; - } - return err; - } - } - - /*Initialize AIR Params*/ - Params.m_inputCoord.m_x = 0; - Params.m_inputCoord.m_y = 0; - Params.m_inputSize.m_height = pC->m_pDecodedPlane->u_height; - Params.m_inputSize.m_width = pC->m_pDecodedPlane->u_width; - Params.m_outputSize.m_width = pImagePlanes->u_width; - Params.m_outputSize.m_height = pImagePlanes->u_height; - Params.m_bOutputStripe = M4OSA_FALSE; - Params.m_outputOrientation = M4COMMON_kOrientationTopLeft; - - /*Initialize Exif params structure*/ - pBasicTags.orientation = M4COMMON_kOrientationUnknown; - - /** - Pan&zoom params*/ - if(M4OSA_TRUE == pC->m_pPto3GPPparams->isPanZoom) - { - /*Save ratio values, they can be reused if the new ratios are 0*/ - tempPanzoomXa = (M4OSA_UInt8)pC->m_pPto3GPPparams->PanZoomXa; - tempPanzoomXb = (M4OSA_UInt8)pC->m_pPto3GPPparams->PanZoomXb; - /*Check that the ratio is not 0*/ - /*Check (a) parameters*/ - if(pC->m_pPto3GPPparams->PanZoomXa == 0) - { - M4OSA_UInt8 maxRatio = 0; - if(pC->m_pPto3GPPparams->PanZoomTopleftXa >= - pC->m_pPto3GPPparams->PanZoomTopleftYa) - { - /*The ratio is 0, that means the area of the picture defined with (a) - parameters is bigger than the image size*/ - if(pC->m_pPto3GPPparams->PanZoomTopleftXa + tempPanzoomXa > 1000) - { - /*The oversize is maxRatio*/ - maxRatio = pC->m_pPto3GPPparams->PanZoomTopleftXa + tempPanzoomXa - 1000; - } - } - else - { - /*The ratio is 0, that means the area of the picture defined with (a) - parameters is bigger than the image size*/ - if(pC->m_pPto3GPPparams->PanZoomTopleftYa + tempPanzoomXa > 1000) - { - /*The oversize is maxRatio*/ - maxRatio = pC->m_pPto3GPPparams->PanZoomTopleftYa + tempPanzoomXa - 1000; - } - } - /*Modify the (a) parameters:*/ - if(pC->m_pPto3GPPparams->PanZoomTopleftXa >= maxRatio) - { - /*The (a) topleft parameters can be moved to keep the same area size*/ - pC->m_pPto3GPPparams->PanZoomTopleftXa -= maxRatio; - } - else - { - /*Move the (a) topleft parameter to 0 but the ratio will be also further - modified to match the image size*/ - pC->m_pPto3GPPparams->PanZoomTopleftXa = 0; - } - if(pC->m_pPto3GPPparams->PanZoomTopleftYa >= maxRatio) - { - /*The (a) topleft parameters can be moved to keep the same area size*/ - pC->m_pPto3GPPparams->PanZoomTopleftYa -= maxRatio; - } - else - { - /*Move the (a) topleft parameter to 0 but the ratio will be also further - modified to match the image size*/ - pC->m_pPto3GPPparams->PanZoomTopleftYa = 0; - } - /*The new ratio is the original one*/ - pC->m_pPto3GPPparams->PanZoomXa = tempPanzoomXa; - if(pC->m_pPto3GPPparams->PanZoomXa + pC->m_pPto3GPPparams->PanZoomTopleftXa > 1000) - { - /*Change the ratio if the area of the picture defined with (a) parameters is - bigger than the image size*/ - pC->m_pPto3GPPparams->PanZoomXa = 1000 - pC->m_pPto3GPPparams->PanZoomTopleftXa; - } - if(pC->m_pPto3GPPparams->PanZoomXa + pC->m_pPto3GPPparams->PanZoomTopleftYa > 1000) - { - /*Change the ratio if the area of the picture defined with (a) parameters is - bigger than the image size*/ - pC->m_pPto3GPPparams->PanZoomXa = 1000 - pC->m_pPto3GPPparams->PanZoomTopleftYa; - } - } - /*Check (b) parameters*/ - if(pC->m_pPto3GPPparams->PanZoomXb == 0) - { - M4OSA_UInt8 maxRatio = 0; - if(pC->m_pPto3GPPparams->PanZoomTopleftXb >= - pC->m_pPto3GPPparams->PanZoomTopleftYb) - { - /*The ratio is 0, that means the area of the picture defined with (b) - parameters is bigger than the image size*/ - if(pC->m_pPto3GPPparams->PanZoomTopleftXb + tempPanzoomXb > 1000) - { - /*The oversize is maxRatio*/ - maxRatio = pC->m_pPto3GPPparams->PanZoomTopleftXb + tempPanzoomXb - 1000; - } - } - else - { - /*The ratio is 0, that means the area of the picture defined with (b) - parameters is bigger than the image size*/ - if(pC->m_pPto3GPPparams->PanZoomTopleftYb + tempPanzoomXb > 1000) - { - /*The oversize is maxRatio*/ - maxRatio = pC->m_pPto3GPPparams->PanZoomTopleftYb + tempPanzoomXb - 1000; - } - } - /*Modify the (b) parameters:*/ - if(pC->m_pPto3GPPparams->PanZoomTopleftXb >= maxRatio) - { - /*The (b) topleft parameters can be moved to keep the same area size*/ - pC->m_pPto3GPPparams->PanZoomTopleftXb -= maxRatio; - } - else - { - /*Move the (b) topleft parameter to 0 but the ratio will be also further - modified to match the image size*/ - pC->m_pPto3GPPparams->PanZoomTopleftXb = 0; - } - if(pC->m_pPto3GPPparams->PanZoomTopleftYb >= maxRatio) - { - /*The (b) topleft parameters can be moved to keep the same area size*/ - pC->m_pPto3GPPparams->PanZoomTopleftYb -= maxRatio; - } - else - { - /*Move the (b) topleft parameter to 0 but the ratio will be also further - modified to match the image size*/ - pC->m_pPto3GPPparams->PanZoomTopleftYb = 0; - } - /*The new ratio is the original one*/ - pC->m_pPto3GPPparams->PanZoomXb = tempPanzoomXb; - if(pC->m_pPto3GPPparams->PanZoomXb + pC->m_pPto3GPPparams->PanZoomTopleftXb > 1000) - { - /*Change the ratio if the area of the picture defined with (b) parameters is - bigger than the image size*/ - pC->m_pPto3GPPparams->PanZoomXb = 1000 - pC->m_pPto3GPPparams->PanZoomTopleftXb; - } - if(pC->m_pPto3GPPparams->PanZoomXb + pC->m_pPto3GPPparams->PanZoomTopleftYb > 1000) - { - /*Change the ratio if the area of the picture defined with (b) parameters is - bigger than the image size*/ - pC->m_pPto3GPPparams->PanZoomXb = 1000 - pC->m_pPto3GPPparams->PanZoomTopleftYb; - } - } - - /** - * Computes AIR parameters */ -/* Params.m_inputCoord.m_x = (M4OSA_UInt32)(pC->m_pDecodedPlane->u_width * - (pC->m_pPto3GPPparams->PanZoomTopleftXa + - (M4OSA_Int16)((pC->m_pPto3GPPparams->PanZoomTopleftXb \ - - pC->m_pPto3GPPparams->PanZoomTopleftXa) * - pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage)) / 100; - Params.m_inputCoord.m_y = (M4OSA_UInt32)(pC->m_pDecodedPlane->u_height * - (pC->m_pPto3GPPparams->PanZoomTopleftYa + - (M4OSA_Int16)((pC->m_pPto3GPPparams->PanZoomTopleftYb\ - - pC->m_pPto3GPPparams->PanZoomTopleftYa) * - pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage)) / 100; - - Params.m_inputSize.m_width = (M4OSA_UInt32)(pC->m_pDecodedPlane->u_width * - (pC->m_pPto3GPPparams->PanZoomXa + - (M4OSA_Int16)((pC->m_pPto3GPPparams->PanZoomXb - pC->m_pPto3GPPparams->PanZoomXa) * - pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage)) / 100; - - Params.m_inputSize.m_height = (M4OSA_UInt32)(pC->m_pDecodedPlane->u_height * - (pC->m_pPto3GPPparams->PanZoomXa + - (M4OSA_Int16)((pC->m_pPto3GPPparams->PanZoomXb - pC->m_pPto3GPPparams->PanZoomXa) * - pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage)) / 100; - */ - // Instead of using pC->m_NbImage we have to use (pC->m_NbImage-1) as pC->m_ImageCounter - // will be x-1 max for x no. of frames - Params.m_inputCoord.m_x = (M4OSA_UInt32)((((M4OSA_Double)pC->m_pDecodedPlane->u_width * - (pC->m_pPto3GPPparams->PanZoomTopleftXa + - (M4OSA_Double)((M4OSA_Double)(pC->m_pPto3GPPparams->PanZoomTopleftXb\ - - pC->m_pPto3GPPparams->PanZoomTopleftXa) * - pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage-1)) / 1000)); - Params.m_inputCoord.m_y = - (M4OSA_UInt32)((((M4OSA_Double)pC->m_pDecodedPlane->u_height * - (pC->m_pPto3GPPparams->PanZoomTopleftYa + - (M4OSA_Double)((M4OSA_Double)(pC->m_pPto3GPPparams->PanZoomTopleftYb\ - - pC->m_pPto3GPPparams->PanZoomTopleftYa) * - pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage-1)) / 1000)); - - Params.m_inputSize.m_width = - (M4OSA_UInt32)((((M4OSA_Double)pC->m_pDecodedPlane->u_width * - (pC->m_pPto3GPPparams->PanZoomXa + - (M4OSA_Double)((M4OSA_Double)(pC->m_pPto3GPPparams->PanZoomXb\ - - pC->m_pPto3GPPparams->PanZoomXa) * - pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage-1)) / 1000)); - - Params.m_inputSize.m_height = - (M4OSA_UInt32)((((M4OSA_Double)pC->m_pDecodedPlane->u_height * - (pC->m_pPto3GPPparams->PanZoomXa + - (M4OSA_Double)((M4OSA_Double)(pC->m_pPto3GPPparams->PanZoomXb \ - - pC->m_pPto3GPPparams->PanZoomXa) * - pC->m_ImageCounter) / (M4OSA_Double)pC->m_NbImage-1)) / 1000)); - - if((Params.m_inputSize.m_width + Params.m_inputCoord.m_x)\ - > pC->m_pDecodedPlane->u_width) - { - Params.m_inputSize.m_width = pC->m_pDecodedPlane->u_width \ - - Params.m_inputCoord.m_x; - } - - if((Params.m_inputSize.m_height + Params.m_inputCoord.m_y)\ - > pC->m_pDecodedPlane->u_height) - { - Params.m_inputSize.m_height = pC->m_pDecodedPlane->u_height\ - - Params.m_inputCoord.m_y; - } - - - - Params.m_inputSize.m_width = (Params.m_inputSize.m_width>>1)<<1; - Params.m_inputSize.m_height = (Params.m_inputSize.m_height>>1)<<1; - } - - - - /** - Picture rendering: Black borders*/ - - if(pC->m_mediaRendering == M4xVSS_kBlackBorders) - { - memset((void *)pImagePlanes[0].pac_data,Y_PLANE_BORDER_VALUE, - (pImagePlanes[0].u_height*pImagePlanes[0].u_stride)); - memset((void *)pImagePlanes[1].pac_data,U_PLANE_BORDER_VALUE, - (pImagePlanes[1].u_height*pImagePlanes[1].u_stride)); - memset((void *)pImagePlanes[2].pac_data,V_PLANE_BORDER_VALUE, - (pImagePlanes[2].u_height*pImagePlanes[2].u_stride)); - - /** - First without pan&zoom*/ - if(M4OSA_FALSE == pC->m_pPto3GPPparams->isPanZoom) - { - switch(pBasicTags.orientation) - { - default: - case M4COMMON_kOrientationUnknown: - Params.m_outputOrientation = M4COMMON_kOrientationTopLeft; - case M4COMMON_kOrientationTopLeft: - case M4COMMON_kOrientationTopRight: - case M4COMMON_kOrientationBottomRight: - case M4COMMON_kOrientationBottomLeft: - if((M4OSA_UInt32)((pC->m_pDecodedPlane->u_height * pImagePlanes->u_width)\ - /pC->m_pDecodedPlane->u_width) <= pImagePlanes->u_height) - //Params.m_inputSize.m_height < Params.m_inputSize.m_width) - { - /*it is height so black borders will be on the top and on the bottom side*/ - Params.m_outputSize.m_width = pImagePlanes->u_width; - Params.m_outputSize.m_height = - (M4OSA_UInt32)((pC->m_pDecodedPlane->u_height \ - * pImagePlanes->u_width) /pC->m_pDecodedPlane->u_width); - /*number of lines at the top*/ - pImagePlanes[0].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_height\ - -Params.m_outputSize.m_height)>>1))*pImagePlanes[0].u_stride; - pImagePlanes[0].u_height = Params.m_outputSize.m_height; - pImagePlanes[1].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_height\ - -(Params.m_outputSize.m_height>>1)))>>1)*pImagePlanes[1].u_stride; - pImagePlanes[1].u_height = Params.m_outputSize.m_height>>1; - pImagePlanes[2].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_height\ - -(Params.m_outputSize.m_height>>1)))>>1)*pImagePlanes[2].u_stride; - pImagePlanes[2].u_height = Params.m_outputSize.m_height>>1; - } - else - { - /*it is width so black borders will be on the left and right side*/ - Params.m_outputSize.m_height = pImagePlanes->u_height; - Params.m_outputSize.m_width = - (M4OSA_UInt32)((pC->m_pDecodedPlane->u_width \ - * pImagePlanes->u_height) /pC->m_pDecodedPlane->u_height); - - pImagePlanes[0].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_width\ - -Params.m_outputSize.m_width)>>1)); - pImagePlanes[0].u_width = Params.m_outputSize.m_width; - pImagePlanes[1].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_width\ - -(Params.m_outputSize.m_width>>1)))>>1); - pImagePlanes[1].u_width = Params.m_outputSize.m_width>>1; - pImagePlanes[2].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_width\ - -(Params.m_outputSize.m_width>>1)))>>1); - pImagePlanes[2].u_width = Params.m_outputSize.m_width>>1; - } - break; - case M4COMMON_kOrientationLeftTop: - case M4COMMON_kOrientationLeftBottom: - case M4COMMON_kOrientationRightTop: - case M4COMMON_kOrientationRightBottom: - if((M4OSA_UInt32)((pC->m_pDecodedPlane->u_width * pImagePlanes->u_width)\ - /pC->m_pDecodedPlane->u_height) < pImagePlanes->u_height) - //Params.m_inputSize.m_height > Params.m_inputSize.m_width) - { - /*it is height so black borders will be on the top and on - the bottom side*/ - Params.m_outputSize.m_height = pImagePlanes->u_width; - Params.m_outputSize.m_width = - (M4OSA_UInt32)((pC->m_pDecodedPlane->u_width \ - * pImagePlanes->u_width) /pC->m_pDecodedPlane->u_height); - /*number of lines at the top*/ - pImagePlanes[0].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_height\ - -Params.m_outputSize.m_width))>>1)*pImagePlanes[0].u_stride)+1; - pImagePlanes[0].u_height = Params.m_outputSize.m_width; - pImagePlanes[1].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_height\ - -(Params.m_outputSize.m_width>>1)))>>1)\ - *pImagePlanes[1].u_stride)+1; - pImagePlanes[1].u_height = Params.m_outputSize.m_width>>1; - pImagePlanes[2].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_height\ - -(Params.m_outputSize.m_width>>1)))>>1)\ - *pImagePlanes[2].u_stride)+1; - pImagePlanes[2].u_height = Params.m_outputSize.m_width>>1; - } - else - { - /*it is width so black borders will be on the left and right side*/ - Params.m_outputSize.m_width = pImagePlanes->u_height; - Params.m_outputSize.m_height = - (M4OSA_UInt32)((pC->m_pDecodedPlane->u_height\ - * pImagePlanes->u_height) /pC->m_pDecodedPlane->u_width); - - pImagePlanes[0].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_width\ - -Params.m_outputSize.m_height))>>1))+1; - pImagePlanes[0].u_width = Params.m_outputSize.m_height; - pImagePlanes[1].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_width\ - -(Params.m_outputSize.m_height>>1)))>>1))+1; - pImagePlanes[1].u_width = Params.m_outputSize.m_height>>1; - pImagePlanes[2].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_width\ - -(Params.m_outputSize.m_height>>1)))>>1))+1; - pImagePlanes[2].u_width = Params.m_outputSize.m_height>>1; - } - break; - } - } - - /** - Secondly with pan&zoom*/ - else - { - switch(pBasicTags.orientation) - { - default: - case M4COMMON_kOrientationUnknown: - Params.m_outputOrientation = M4COMMON_kOrientationTopLeft; - case M4COMMON_kOrientationTopLeft: - case M4COMMON_kOrientationTopRight: - case M4COMMON_kOrientationBottomRight: - case M4COMMON_kOrientationBottomLeft: - /*NO ROTATION*/ - if((M4OSA_UInt32)((pC->m_pDecodedPlane->u_height * pImagePlanes->u_width)\ - /pC->m_pDecodedPlane->u_width) <= pImagePlanes->u_height) - //Params.m_inputSize.m_height < Params.m_inputSize.m_width) - { - /*Black borders will be on the top and bottom of the output video*/ - /*Maximum output height if the input image aspect ratio is kept and if - the output width is the screen width*/ - M4OSA_UInt32 tempOutputSizeHeight = - (M4OSA_UInt32)((pC->m_pDecodedPlane->u_height\ - * pImagePlanes->u_width) /pC->m_pDecodedPlane->u_width); - M4OSA_UInt32 tempInputSizeHeightMax = 0; - M4OSA_UInt32 tempFinalInputHeight = 0; - /*The output width is the screen width*/ - Params.m_outputSize.m_width = pImagePlanes->u_width; - tempOutputSizeHeight = (tempOutputSizeHeight>>1)<<1; - - /*Maximum input height according to the maximum output height - (proportional to the maximum output height)*/ - tempInputSizeHeightMax = (pImagePlanes->u_height\ - *Params.m_inputSize.m_height)/tempOutputSizeHeight; - tempInputSizeHeightMax = (tempInputSizeHeightMax>>1)<<1; - - /*Check if the maximum possible input height is contained into the - input image height*/ - if(tempInputSizeHeightMax <= pC->m_pDecodedPlane->u_height) - { - /*The maximum possible input height is contained in the input - image height, - that means no black borders, the input pan zoom area will be extended - so that the input AIR height will be the maximum possible*/ - if(((tempInputSizeHeightMax - Params.m_inputSize.m_height)>>1)\ - <= Params.m_inputCoord.m_y - && ((tempInputSizeHeightMax - Params.m_inputSize.m_height)>>1)\ - <= pC->m_pDecodedPlane->u_height -(Params.m_inputCoord.m_y\ - + Params.m_inputSize.m_height)) - { - /*The input pan zoom area can be extended symmetrically on the - top and bottom side*/ - Params.m_inputCoord.m_y -= ((tempInputSizeHeightMax \ - - Params.m_inputSize.m_height)>>1); - } - else if(Params.m_inputCoord.m_y < pC->m_pDecodedPlane->u_height\ - -(Params.m_inputCoord.m_y + Params.m_inputSize.m_height)) - { - /*There is not enough place above the input pan zoom area to - extend it symmetrically, - so extend it to the maximum on the top*/ - Params.m_inputCoord.m_y = 0; - } - else - { - /*There is not enough place below the input pan zoom area to - extend it symmetrically, - so extend it to the maximum on the bottom*/ - Params.m_inputCoord.m_y = pC->m_pDecodedPlane->u_height \ - - tempInputSizeHeightMax; - } - /*The input height of the AIR is the maximum possible height*/ - Params.m_inputSize.m_height = tempInputSizeHeightMax; - } - else - { - /*The maximum possible input height is greater than the input - image height, - that means black borders are necessary to keep aspect ratio - The input height of the AIR is all the input image height*/ - Params.m_outputSize.m_height = - (tempOutputSizeHeight*pC->m_pDecodedPlane->u_height)\ - /Params.m_inputSize.m_height; - Params.m_outputSize.m_height = (Params.m_outputSize.m_height>>1)<<1; - Params.m_inputCoord.m_y = 0; - Params.m_inputSize.m_height = pC->m_pDecodedPlane->u_height; - pImagePlanes[0].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_height\ - -Params.m_outputSize.m_height)>>1))*pImagePlanes[0].u_stride; - pImagePlanes[0].u_height = Params.m_outputSize.m_height; - pImagePlanes[1].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_height\ - -(Params.m_outputSize.m_height>>1)))>>1)\ - *pImagePlanes[1].u_stride); - pImagePlanes[1].u_height = Params.m_outputSize.m_height>>1; - pImagePlanes[2].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_height\ - -(Params.m_outputSize.m_height>>1)))>>1)\ - *pImagePlanes[2].u_stride); - pImagePlanes[2].u_height = Params.m_outputSize.m_height>>1; - } - } - else - { - /*Black borders will be on the left and right side of the output video*/ - /*Maximum output width if the input image aspect ratio is kept and if the - output height is the screen height*/ - M4OSA_UInt32 tempOutputSizeWidth = - (M4OSA_UInt32)((pC->m_pDecodedPlane->u_width \ - * pImagePlanes->u_height) /pC->m_pDecodedPlane->u_height); - M4OSA_UInt32 tempInputSizeWidthMax = 0; - M4OSA_UInt32 tempFinalInputWidth = 0; - /*The output height is the screen height*/ - Params.m_outputSize.m_height = pImagePlanes->u_height; - tempOutputSizeWidth = (tempOutputSizeWidth>>1)<<1; - - /*Maximum input width according to the maximum output width - (proportional to the maximum output width)*/ - tempInputSizeWidthMax = - (pImagePlanes->u_width*Params.m_inputSize.m_width)\ - /tempOutputSizeWidth; - tempInputSizeWidthMax = (tempInputSizeWidthMax>>1)<<1; - - /*Check if the maximum possible input width is contained into the input - image width*/ - if(tempInputSizeWidthMax <= pC->m_pDecodedPlane->u_width) - { - /*The maximum possible input width is contained in the input - image width, - that means no black borders, the input pan zoom area will be extended - so that the input AIR width will be the maximum possible*/ - if(((tempInputSizeWidthMax - Params.m_inputSize.m_width)>>1) \ - <= Params.m_inputCoord.m_x - && ((tempInputSizeWidthMax - Params.m_inputSize.m_width)>>1)\ - <= pC->m_pDecodedPlane->u_width -(Params.m_inputCoord.m_x \ - + Params.m_inputSize.m_width)) - { - /*The input pan zoom area can be extended symmetrically on the - right and left side*/ - Params.m_inputCoord.m_x -= ((tempInputSizeWidthMax\ - - Params.m_inputSize.m_width)>>1); - } - else if(Params.m_inputCoord.m_x < pC->m_pDecodedPlane->u_width\ - -(Params.m_inputCoord.m_x + Params.m_inputSize.m_width)) - { - /*There is not enough place above the input pan zoom area to - extend it symmetrically, - so extend it to the maximum on the left*/ - Params.m_inputCoord.m_x = 0; - } - else - { - /*There is not enough place below the input pan zoom area - to extend it symmetrically, - so extend it to the maximum on the right*/ - Params.m_inputCoord.m_x = pC->m_pDecodedPlane->u_width \ - - tempInputSizeWidthMax; - } - /*The input width of the AIR is the maximum possible width*/ - Params.m_inputSize.m_width = tempInputSizeWidthMax; - } - else - { - /*The maximum possible input width is greater than the input - image width, - that means black borders are necessary to keep aspect ratio - The input width of the AIR is all the input image width*/ - Params.m_outputSize.m_width =\ - (tempOutputSizeWidth*pC->m_pDecodedPlane->u_width)\ - /Params.m_inputSize.m_width; - Params.m_outputSize.m_width = (Params.m_outputSize.m_width>>1)<<1; - Params.m_inputCoord.m_x = 0; - Params.m_inputSize.m_width = pC->m_pDecodedPlane->u_width; - pImagePlanes[0].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_width\ - -Params.m_outputSize.m_width)>>1)); - pImagePlanes[0].u_width = Params.m_outputSize.m_width; - pImagePlanes[1].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_width\ - -(Params.m_outputSize.m_width>>1)))>>1); - pImagePlanes[1].u_width = Params.m_outputSize.m_width>>1; - pImagePlanes[2].u_topleft = - (M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_width\ - -(Params.m_outputSize.m_width>>1)))>>1); - pImagePlanes[2].u_width = Params.m_outputSize.m_width>>1; - } - } - break; - case M4COMMON_kOrientationLeftTop: - case M4COMMON_kOrientationLeftBottom: - case M4COMMON_kOrientationRightTop: - case M4COMMON_kOrientationRightBottom: - /*ROTATION*/ - if((M4OSA_UInt32)((pC->m_pDecodedPlane->u_width * pImagePlanes->u_width)\ - /pC->m_pDecodedPlane->u_height) < pImagePlanes->u_height) - //Params.m_inputSize.m_height > Params.m_inputSize.m_width) - { - /*Black borders will be on the left and right side of the output video*/ - /*Maximum output height if the input image aspect ratio is kept and if - the output height is the screen width*/ - M4OSA_UInt32 tempOutputSizeHeight = - (M4OSA_UInt32)((pC->m_pDecodedPlane->u_width * pImagePlanes->u_width)\ - /pC->m_pDecodedPlane->u_height); - M4OSA_UInt32 tempInputSizeHeightMax = 0; - M4OSA_UInt32 tempFinalInputHeight = 0; - /*The output width is the screen height*/ - Params.m_outputSize.m_height = pImagePlanes->u_width; - Params.m_outputSize.m_width= pImagePlanes->u_height; - tempOutputSizeHeight = (tempOutputSizeHeight>>1)<<1; - - /*Maximum input height according to the maximum output height - (proportional to the maximum output height)*/ - tempInputSizeHeightMax = - (pImagePlanes->u_height*Params.m_inputSize.m_width)\ - /tempOutputSizeHeight; - tempInputSizeHeightMax = (tempInputSizeHeightMax>>1)<<1; - - /*Check if the maximum possible input height is contained into the - input image width (rotation included)*/ - if(tempInputSizeHeightMax <= pC->m_pDecodedPlane->u_width) - { - /*The maximum possible input height is contained in the input - image width (rotation included), - that means no black borders, the input pan zoom area will be extended - so that the input AIR width will be the maximum possible*/ - if(((tempInputSizeHeightMax - Params.m_inputSize.m_width)>>1) \ - <= Params.m_inputCoord.m_x - && ((tempInputSizeHeightMax - Params.m_inputSize.m_width)>>1)\ - <= pC->m_pDecodedPlane->u_width -(Params.m_inputCoord.m_x \ - + Params.m_inputSize.m_width)) - { - /*The input pan zoom area can be extended symmetrically on the - right and left side*/ - Params.m_inputCoord.m_x -= ((tempInputSizeHeightMax \ - - Params.m_inputSize.m_width)>>1); - } - else if(Params.m_inputCoord.m_x < pC->m_pDecodedPlane->u_width\ - -(Params.m_inputCoord.m_x + Params.m_inputSize.m_width)) - { - /*There is not enough place on the left of the input pan - zoom area to extend it symmetrically, - so extend it to the maximum on the left*/ - Params.m_inputCoord.m_x = 0; - } - else - { - /*There is not enough place on the right of the input pan zoom - area to extend it symmetrically, - so extend it to the maximum on the right*/ - Params.m_inputCoord.m_x = - pC->m_pDecodedPlane->u_width - tempInputSizeHeightMax; - } - /*The input width of the AIR is the maximum possible width*/ - Params.m_inputSize.m_width = tempInputSizeHeightMax; - } - else - { - /*The maximum possible input height is greater than the input - image width (rotation included), - that means black borders are necessary to keep aspect ratio - The input width of the AIR is all the input image width*/ - Params.m_outputSize.m_width = - (tempOutputSizeHeight*pC->m_pDecodedPlane->u_width)\ - /Params.m_inputSize.m_width; - Params.m_outputSize.m_width = (Params.m_outputSize.m_width>>1)<<1; - Params.m_inputCoord.m_x = 0; - Params.m_inputSize.m_width = pC->m_pDecodedPlane->u_width; - pImagePlanes[0].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_height\ - -Params.m_outputSize.m_width))>>1)*pImagePlanes[0].u_stride)+1; - pImagePlanes[0].u_height = Params.m_outputSize.m_width; - pImagePlanes[1].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_height\ - -(Params.m_outputSize.m_width>>1)))>>1)\ - *pImagePlanes[1].u_stride)+1; - pImagePlanes[1].u_height = Params.m_outputSize.m_width>>1; - pImagePlanes[2].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_height\ - -(Params.m_outputSize.m_width>>1)))>>1)\ - *pImagePlanes[2].u_stride)+1; - pImagePlanes[2].u_height = Params.m_outputSize.m_width>>1; - } - } - else - { - /*Black borders will be on the top and bottom of the output video*/ - /*Maximum output width if the input image aspect ratio is kept and if - the output width is the screen height*/ - M4OSA_UInt32 tempOutputSizeWidth = - (M4OSA_UInt32)((pC->m_pDecodedPlane->u_height * pImagePlanes->u_height)\ - /pC->m_pDecodedPlane->u_width); - M4OSA_UInt32 tempInputSizeWidthMax = 0; - M4OSA_UInt32 tempFinalInputWidth = 0, tempFinalOutputWidth = 0; - /*The output height is the screen width*/ - Params.m_outputSize.m_width = pImagePlanes->u_height; - Params.m_outputSize.m_height= pImagePlanes->u_width; - tempOutputSizeWidth = (tempOutputSizeWidth>>1)<<1; - - /*Maximum input width according to the maximum output width - (proportional to the maximum output width)*/ - tempInputSizeWidthMax = - (pImagePlanes->u_width*Params.m_inputSize.m_height)/tempOutputSizeWidth; - tempInputSizeWidthMax = (tempInputSizeWidthMax>>1)<<1; - - /*Check if the maximum possible input width is contained into the input - image height (rotation included)*/ - if(tempInputSizeWidthMax <= pC->m_pDecodedPlane->u_height) - { - /*The maximum possible input width is contained in the input - image height (rotation included), - that means no black borders, the input pan zoom area will be extended - so that the input AIR height will be the maximum possible*/ - if(((tempInputSizeWidthMax - Params.m_inputSize.m_height)>>1) \ - <= Params.m_inputCoord.m_y - && ((tempInputSizeWidthMax - Params.m_inputSize.m_height)>>1)\ - <= pC->m_pDecodedPlane->u_height -(Params.m_inputCoord.m_y \ - + Params.m_inputSize.m_height)) - { - /*The input pan zoom area can be extended symmetrically on - the right and left side*/ - Params.m_inputCoord.m_y -= ((tempInputSizeWidthMax \ - - Params.m_inputSize.m_height)>>1); - } - else if(Params.m_inputCoord.m_y < pC->m_pDecodedPlane->u_height\ - -(Params.m_inputCoord.m_y + Params.m_inputSize.m_height)) - { - /*There is not enough place on the top of the input pan zoom - area to extend it symmetrically, - so extend it to the maximum on the top*/ - Params.m_inputCoord.m_y = 0; - } - else - { - /*There is not enough place on the bottom of the input pan zoom - area to extend it symmetrically, - so extend it to the maximum on the bottom*/ - Params.m_inputCoord.m_y = pC->m_pDecodedPlane->u_height\ - - tempInputSizeWidthMax; - } - /*The input height of the AIR is the maximum possible height*/ - Params.m_inputSize.m_height = tempInputSizeWidthMax; - } - else - { - /*The maximum possible input width is greater than the input\ - image height (rotation included), - that means black borders are necessary to keep aspect ratio - The input height of the AIR is all the input image height*/ - Params.m_outputSize.m_height = - (tempOutputSizeWidth*pC->m_pDecodedPlane->u_height)\ - /Params.m_inputSize.m_height; - Params.m_outputSize.m_height = (Params.m_outputSize.m_height>>1)<<1; - Params.m_inputCoord.m_y = 0; - Params.m_inputSize.m_height = pC->m_pDecodedPlane->u_height; - pImagePlanes[0].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[0].u_width\ - -Params.m_outputSize.m_height))>>1))+1; - pImagePlanes[0].u_width = Params.m_outputSize.m_height; - pImagePlanes[1].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[1].u_width\ - -(Params.m_outputSize.m_height>>1)))>>1))+1; - pImagePlanes[1].u_width = Params.m_outputSize.m_height>>1; - pImagePlanes[2].u_topleft = - ((M4xVSS_ABS((M4OSA_Int32)(pImagePlanes[2].u_width\ - -(Params.m_outputSize.m_height>>1)))>>1))+1; - pImagePlanes[2].u_width = Params.m_outputSize.m_height>>1; - } - } - break; - } - } - - /*Width and height have to be even*/ - Params.m_outputSize.m_width = (Params.m_outputSize.m_width>>1)<<1; - Params.m_outputSize.m_height = (Params.m_outputSize.m_height>>1)<<1; - Params.m_inputSize.m_width = (Params.m_inputSize.m_width>>1)<<1; - Params.m_inputSize.m_height = (Params.m_inputSize.m_height>>1)<<1; - pImagePlanes[0].u_width = (pImagePlanes[0].u_width>>1)<<1; - pImagePlanes[1].u_width = (pImagePlanes[1].u_width>>1)<<1; - pImagePlanes[2].u_width = (pImagePlanes[2].u_width>>1)<<1; - pImagePlanes[0].u_height = (pImagePlanes[0].u_height>>1)<<1; - pImagePlanes[1].u_height = (pImagePlanes[1].u_height>>1)<<1; - pImagePlanes[2].u_height = (pImagePlanes[2].u_height>>1)<<1; - - /*Check that values are coherent*/ - if(Params.m_inputSize.m_height == Params.m_outputSize.m_height) - { - Params.m_inputSize.m_width = Params.m_outputSize.m_width; - } - else if(Params.m_inputSize.m_width == Params.m_outputSize.m_width) - { - Params.m_inputSize.m_height = Params.m_outputSize.m_height; - } - } - - /** - Picture rendering: Resizing and Cropping*/ - if(pC->m_mediaRendering != M4xVSS_kBlackBorders) - { - switch(pBasicTags.orientation) - { - default: - case M4COMMON_kOrientationUnknown: - Params.m_outputOrientation = M4COMMON_kOrientationTopLeft; - case M4COMMON_kOrientationTopLeft: - case M4COMMON_kOrientationTopRight: - case M4COMMON_kOrientationBottomRight: - case M4COMMON_kOrientationBottomLeft: - Params.m_outputSize.m_height = pImagePlanes->u_height; - Params.m_outputSize.m_width = pImagePlanes->u_width; - break; - case M4COMMON_kOrientationLeftTop: - case M4COMMON_kOrientationLeftBottom: - case M4COMMON_kOrientationRightTop: - case M4COMMON_kOrientationRightBottom: - Params.m_outputSize.m_height = pImagePlanes->u_width; - Params.m_outputSize.m_width = pImagePlanes->u_height; - break; - } - } - - /** - Picture rendering: Cropping*/ - if(pC->m_mediaRendering == M4xVSS_kCropping) - { - if((Params.m_outputSize.m_height * Params.m_inputSize.m_width)\ - /Params.m_outputSize.m_width<Params.m_inputSize.m_height) - { - M4OSA_UInt32 tempHeight = Params.m_inputSize.m_height; - /*height will be cropped*/ - Params.m_inputSize.m_height = (M4OSA_UInt32)((Params.m_outputSize.m_height \ - * Params.m_inputSize.m_width) /Params.m_outputSize.m_width); - Params.m_inputSize.m_height = (Params.m_inputSize.m_height>>1)<<1; - if(M4OSA_FALSE == pC->m_pPto3GPPparams->isPanZoom) - { - Params.m_inputCoord.m_y = (M4OSA_Int32)((M4OSA_Int32)\ - ((pC->m_pDecodedPlane->u_height - Params.m_inputSize.m_height))>>1); - } - else - { - Params.m_inputCoord.m_y += (M4OSA_Int32)((M4OSA_Int32)\ - ((tempHeight - Params.m_inputSize.m_height))>>1); - } - } - else - { - M4OSA_UInt32 tempWidth= Params.m_inputSize.m_width; - /*width will be cropped*/ - Params.m_inputSize.m_width = (M4OSA_UInt32)((Params.m_outputSize.m_width \ - * Params.m_inputSize.m_height) /Params.m_outputSize.m_height); - Params.m_inputSize.m_width = (Params.m_inputSize.m_width>>1)<<1; - if(M4OSA_FALSE == pC->m_pPto3GPPparams->isPanZoom) - { - Params.m_inputCoord.m_x = (M4OSA_Int32)((M4OSA_Int32)\ - ((pC->m_pDecodedPlane->u_width - Params.m_inputSize.m_width))>>1); - } - else - { - Params.m_inputCoord.m_x += (M4OSA_Int32)\ - (((M4OSA_Int32)(tempWidth - Params.m_inputSize.m_width))>>1); - } - } - } - - - - /** - * Call AIR functions */ - if(M4OSA_NULL == pC->m_air_context) - { - err = M4AIR_create(&pC->m_air_context, M4AIR_kYUV420P); - if(err != M4NO_ERROR) - { - free(pC->m_pDecodedPlane[0].pac_data); - free(pC->m_pDecodedPlane); - pC->m_pDecodedPlane = M4OSA_NULL; - M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct:\ - Error when initializing AIR: 0x%x", err); - return err; - } - } - - err = M4AIR_configure(pC->m_air_context, &Params); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct:\ - Error when configuring AIR: 0x%x", err); - M4AIR_cleanUp(pC->m_air_context); - free(pC->m_pDecodedPlane[0].pac_data); - free(pC->m_pDecodedPlane); - pC->m_pDecodedPlane = M4OSA_NULL; - return err; - } - - err = M4AIR_get(pC->m_air_context, pC->m_pDecodedPlane, pImagePlanes); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct: Error when getting AIR plane: 0x%x", err); - M4AIR_cleanUp(pC->m_air_context); - free(pC->m_pDecodedPlane[0].pac_data); - free(pC->m_pDecodedPlane); - pC->m_pDecodedPlane = M4OSA_NULL; - return err; - } - pImagePlanes[0] = pImagePlanes1; - pImagePlanes[1] = pImagePlanes2; - pImagePlanes[2] = pImagePlanes3; - } - - - /** - * Increment the image counter */ - pC->m_ImageCounter++; - - /** - * Check end of sequence */ - last_frame_flag = (pC->m_ImageCounter >= pC->m_NbImage); - - /** - * Keep the picture duration */ - *pPictureDuration = pC->m_timeDuration; - - if (1 == last_frame_flag) - { - if(M4OSA_NULL != pC->m_air_context) - { - err = M4AIR_cleanUp(pC->m_air_context); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_PictureCallbackFct: Error when cleaning AIR: 0x%x", err); - return err; - } - } - if(M4OSA_NULL != pC->m_pDecodedPlane) - { - free(pC->m_pDecodedPlane[0].pac_data); - free(pC->m_pDecodedPlane); - pC->m_pDecodedPlane = M4OSA_NULL; - } - return M4PTO3GPP_WAR_LAST_PICTURE; - } - - M4OSA_TRACE1_0("M4xVSS_PictureCallbackFct: Leaving "); - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4xVSS_internalStartConvertPictureTo3gp(M4OSA_Context pContext) - * @brief This function initializes Pto3GPP with the given parameters - * @note The "Pictures to 3GPP" parameters are given by the internal xVSS - * context. This context contains a pointer on the current element - * of the chained list of Pto3GPP parameters. - * @param pContext (IN) The integrator own context - * - * @return M4NO_ERROR: No error - * @return M4PTO3GPP_WAR_LAST_PICTURE: The returned image is the last one - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalStartConvertPictureTo3gp(M4OSA_Context pContext) -{ - /************************************************************************/ - /* Definitions to generate dummy AMR file used to add AMR silence in files generated - by Pto3GPP */ - #define M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE 13 - /* This constant is defined in M4VSS3GPP_InternalConfig.h */ - extern const M4OSA_UInt8\ - M4VSS3GPP_AMR_AU_SILENCE_FRAME_048[M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE]; - - /* AMR silent frame used to compute dummy AMR silence file */ - #define M4VSS3GPP_AMR_HEADER_SIZE 6 - const M4OSA_UInt8 M4VSS3GPP_AMR_HEADER[M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE] = - { 0x23, 0x21, 0x41, 0x4d, 0x52, 0x0a }; - /************************************************************************/ - - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4OSA_ERR err; - M4PTO3GPP_Context pM4PTO3GPP_Ctxt = M4OSA_NULL; - M4PTO3GPP_Params Params; - M4xVSS_PictureCallbackCtxt* pCallBackCtxt; - M4OSA_Bool cmpResult=M4OSA_FALSE; - M4OSA_Context pDummyAMRFile; - M4OSA_Char out_amr[M4XVSS_MAX_PATH_LEN]; - /*UTF conversion support*/ - M4OSA_Char* pDecodedPath = M4OSA_NULL; - M4OSA_UInt32 i; - - /** - * Create a M4PTO3GPP instance */ - err = M4PTO3GPP_Init( &pM4PTO3GPP_Ctxt, xVSS_context->pFileReadPtr, - xVSS_context->pFileWritePtr); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalStartConvertPictureTo3gp returned %ld\n",err); - return err; - } - - pCallBackCtxt = (M4xVSS_PictureCallbackCtxt*)M4OSA_32bitAlignedMalloc(sizeof(M4xVSS_PictureCallbackCtxt), - M4VS,(M4OSA_Char *) "Pto3gpp callback struct"); - if(pCallBackCtxt == M4OSA_NULL) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_internalStartConvertPictureTo3gp"); - return M4ERR_ALLOC; - } - - Params.OutputVideoFrameSize = xVSS_context->pSettings->xVSS.outputVideoSize; - Params.OutputVideoFormat = xVSS_context->pSettings->xVSS.outputVideoFormat; - Params.videoProfile = xVSS_context->pSettings->xVSS.outputVideoProfile; - Params.videoLevel = xVSS_context->pSettings->xVSS.outputVideoLevel; - - /** - * Generate "dummy" amr file containing silence in temporary folder */ - M4OSA_chrNCopy(out_amr, xVSS_context->pTempPath, M4XVSS_MAX_PATH_LEN - 1); - strncat((char *)out_amr, (const char *)"dummy.amr\0", 10); - - /** - * UTF conversion: convert the temporary path into the customer format*/ - pDecodedPath = out_amr; - - if(xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer != M4OSA_NULL) - { - M4OSA_UInt32 length = 0; - err = M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void*) out_amr, - (M4OSA_Void*) xVSS_context->UTFConversionContext.pTempOutConversionBuffer, &length); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalStartConvertPictureTo3gp:\ - M4xVSS_internalConvertFromUTF8 returns err: 0x%x",err); - return err; - } - pDecodedPath = xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the conversion, now use the converted path*/ - - err = xVSS_context->pFileWritePtr->openWrite(&pDummyAMRFile, pDecodedPath, M4OSA_kFileWrite); - - /*Commented because of the use of the UTF conversion see above*/ -/* err = xVSS_context->pFileWritePtr->openWrite(&pDummyAMRFile, out_amr, M4OSA_kFileWrite); - */ - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_2("M4xVSS_internalConvertPictureTo3gp: Can't open output dummy amr file %s,\ - error: 0x%x\n",out_amr, err); - return err; - } - - err = xVSS_context->pFileWritePtr->writeData(pDummyAMRFile, - (M4OSA_Int8*)M4VSS3GPP_AMR_HEADER, M4VSS3GPP_AMR_HEADER_SIZE); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_2("M4xVSS_internalConvertPictureTo3gp: Can't write output dummy amr file %s,\ - error: 0x%x\n",out_amr, err); - return err; - } - - err = xVSS_context->pFileWritePtr->writeData(pDummyAMRFile, - (M4OSA_Int8*)M4VSS3GPP_AMR_AU_SILENCE_FRAME_048, M4VSS3GPP_AMR_AU_SILENCE_FRAME_048_SIZE); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_2("M4xVSS_internalConvertPictureTo3gp: \ - Can't write output dummy amr file %s, error: 0x%x\n",out_amr, err); - return err; - } - - err = xVSS_context->pFileWritePtr->closeWrite(pDummyAMRFile); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_2("M4xVSS_internalConvertPictureTo3gp: \ - Can't close output dummy amr file %s, error: 0x%x\n",out_amr, err); - return err; - } - - /** - * Fill parameters for Pto3GPP with the parameters contained in the current element of the - * Pto3GPP parameters chained list and with default parameters */ -/*+ New Encoder bitrates */ - if(xVSS_context->pSettings->xVSS.outputVideoBitrate == 0) { - Params.OutputVideoBitrate = M4VIDEOEDITING_kVARIABLE_KBPS; - } - else { - Params.OutputVideoBitrate = xVSS_context->pSettings->xVSS.outputVideoBitrate; - } - M4OSA_TRACE1_1("M4xVSS_internalStartConvertPicTo3GP: video bitrate = %d", - Params.OutputVideoBitrate); -/*- New Encoder bitrates */ - Params.OutputFileMaxSize = M4PTO3GPP_kUNLIMITED; - Params.pPictureCallbackFct = M4xVSS_PictureCallbackFct; - Params.pPictureCallbackCtxt = pCallBackCtxt; - /*FB: change to use the converted path (UTF conversion) see the conversion above*/ - /*Fix :- Adding Audio Track in Image as input :AudioTarckFile Setting to NULL */ - Params.pInputAudioTrackFile = M4OSA_NULL;//(M4OSA_Void*)pDecodedPath;//out_amr; - Params.AudioPaddingMode = M4PTO3GPP_kAudioPaddingMode_Loop; - Params.AudioFileFormat = M4VIDEOEDITING_kFileType_AMR; - Params.pOutput3gppFile = xVSS_context->pPTo3GPPcurrentParams->pFileOut; - Params.pTemporaryFile = xVSS_context->pPTo3GPPcurrentParams->pFileTemp; - /*+PR No: blrnxpsw#223*/ - /*Increasing frequency of Frame, calculating Nos of Frame = duration /FPS */ - /*Other changes made is @ M4xVSS_API.c @ line 3841 in M4xVSS_SendCommand*/ - /*If case check for PanZoom removed */ - Params.NbVideoFrames = (M4OSA_UInt32) - (xVSS_context->pPTo3GPPcurrentParams->duration \ - / xVSS_context->pPTo3GPPcurrentParams->framerate); /* */ - pCallBackCtxt->m_timeDuration = xVSS_context->pPTo3GPPcurrentParams->framerate; - /*-PR No: blrnxpsw#223*/ - pCallBackCtxt->m_ImageCounter = 0; - pCallBackCtxt->m_FileIn = xVSS_context->pPTo3GPPcurrentParams->pFileIn; - pCallBackCtxt->m_NbImage = Params.NbVideoFrames; - pCallBackCtxt->m_pFileReadPtr = xVSS_context->pFileReadPtr; - pCallBackCtxt->m_pDecodedPlane = M4OSA_NULL; - pCallBackCtxt->m_pPto3GPPparams = xVSS_context->pPTo3GPPcurrentParams; - pCallBackCtxt->m_air_context = M4OSA_NULL; - pCallBackCtxt->m_mediaRendering = xVSS_context->pPTo3GPPcurrentParams->MediaRendering; - - /** - * Set the input and output files */ - err = M4PTO3GPP_Open(pM4PTO3GPP_Ctxt, &Params); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4PTO3GPP_Open returned: 0x%x\n",err); - if(pCallBackCtxt != M4OSA_NULL) - { - free(pCallBackCtxt); - pCallBackCtxt = M4OSA_NULL; - } - M4PTO3GPP_CleanUp(pM4PTO3GPP_Ctxt); - return err; - } - - /** - * Save context to be able to call Pto3GPP step function in M4xVSS_step function */ - xVSS_context->pM4PTO3GPP_Ctxt = pM4PTO3GPP_Ctxt; - xVSS_context->pCallBackCtxt = pCallBackCtxt; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4xVSS_internalStopConvertPictureTo3gp(M4OSA_Context pContext) - * @brief This function cleans up Pto3GPP - * @note - * @param pContext (IN) The integrator own context - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalStopConvertPictureTo3gp(M4OSA_Context pContext) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4OSA_ERR err; - M4OSA_Char out_amr[M4XVSS_MAX_PATH_LEN]; - /*UTF conversion support*/ - M4OSA_Char* pDecodedPath = M4OSA_NULL; - - /** - * Free the PTO3GPP callback context */ - if(M4OSA_NULL != xVSS_context->pCallBackCtxt) - { - free(xVSS_context->pCallBackCtxt); - xVSS_context->pCallBackCtxt = M4OSA_NULL; - } - - /** - * Finalize the output file */ - err = M4PTO3GPP_Close(xVSS_context->pM4PTO3GPP_Ctxt); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4PTO3GPP_Close returned 0x%x\n",err); - M4PTO3GPP_CleanUp(xVSS_context->pM4PTO3GPP_Ctxt); - return err; - } - - /** - * Free this M4PTO3GPP instance */ - err = M4PTO3GPP_CleanUp(xVSS_context->pM4PTO3GPP_Ctxt); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4PTO3GPP_CleanUp returned 0x%x\n",err); - return err; - } - - /** - * Remove dummy.amr file */ - M4OSA_chrNCopy(out_amr, xVSS_context->pTempPath, M4XVSS_MAX_PATH_LEN - 1); - strncat((char *)out_amr, (const char *)"dummy.amr\0", 10); - - /** - * UTF conversion: convert the temporary path into the customer format*/ - pDecodedPath = out_amr; - - if(xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer != M4OSA_NULL) - { - M4OSA_UInt32 length = 0; - err = M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void*) out_amr, - (M4OSA_Void*) xVSS_context->UTFConversionContext.pTempOutConversionBuffer, &length); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalStopConvertPictureTo3gp:\ - M4xVSS_internalConvertFromUTF8 returns err: 0x%x",err); - return err; - } - pDecodedPath = xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - /** - * End of the conversion, now use the decoded path*/ - remove((const char *)pDecodedPath); - - /*Commented because of the use of the UTF conversion*/ -/* remove(out_amr); - */ - - xVSS_context->pM4PTO3GPP_Ctxt = M4OSA_NULL; - xVSS_context->pCallBackCtxt = M4OSA_NULL; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalConvertRGBtoYUV(M4xVSS_FramingStruct* framingCtx) - * @brief This function converts an RGB565 plane to YUV420 planar - * @note It is used only for framing effect - * It allocates output YUV planes - * @param framingCtx (IN) The framing struct containing input RGB565 plane - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - * @return M4ERR_ALLOC: Allocation error (no more memory) - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalConvertRGBtoYUV(M4xVSS_FramingStruct* framingCtx) -{ - M4OSA_ERR err; - - /** - * Allocate output YUV planes */ - framingCtx->FramingYuv = (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc(3*sizeof(M4VIFI_ImagePlane), - M4VS, (M4OSA_Char *)"M4xVSS_internalConvertRGBtoYUV: Output plane YUV"); - if(framingCtx->FramingYuv == M4OSA_NULL) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertRGBtoYUV"); - return M4ERR_ALLOC; - } - framingCtx->FramingYuv[0].u_width = framingCtx->FramingRgb->u_width; - framingCtx->FramingYuv[0].u_height = framingCtx->FramingRgb->u_height; - framingCtx->FramingYuv[0].u_topleft = 0; - framingCtx->FramingYuv[0].u_stride = framingCtx->FramingRgb->u_width; - framingCtx->FramingYuv[0].pac_data = - (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc((framingCtx->FramingYuv[0].u_width\ - *framingCtx->FramingYuv[0].u_height*3)>>1, M4VS, (M4OSA_Char *)\ - "Alloc for the Convertion output YUV");; - if(framingCtx->FramingYuv[0].pac_data == M4OSA_NULL) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertRGBtoYUV"); - return M4ERR_ALLOC; - } - framingCtx->FramingYuv[1].u_width = (framingCtx->FramingRgb->u_width)>>1; - framingCtx->FramingYuv[1].u_height = (framingCtx->FramingRgb->u_height)>>1; - framingCtx->FramingYuv[1].u_topleft = 0; - framingCtx->FramingYuv[1].u_stride = (framingCtx->FramingRgb->u_width)>>1; - framingCtx->FramingYuv[1].pac_data = framingCtx->FramingYuv[0].pac_data \ - + framingCtx->FramingYuv[0].u_width * framingCtx->FramingYuv[0].u_height; - framingCtx->FramingYuv[2].u_width = (framingCtx->FramingRgb->u_width)>>1; - framingCtx->FramingYuv[2].u_height = (framingCtx->FramingRgb->u_height)>>1; - framingCtx->FramingYuv[2].u_topleft = 0; - framingCtx->FramingYuv[2].u_stride = (framingCtx->FramingRgb->u_width)>>1; - framingCtx->FramingYuv[2].pac_data = framingCtx->FramingYuv[1].pac_data \ - + framingCtx->FramingYuv[1].u_width * framingCtx->FramingYuv[1].u_height; - - /** - * Convert input RGB 565 to YUV 420 to be able to merge it with output video in framing - effect */ - err = M4VIFI_xVSS_RGB565toYUV420(M4OSA_NULL, framingCtx->FramingRgb, framingCtx->FramingYuv); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalConvertRGBtoYUV:\ - error when converting from RGB to YUV: 0x%x\n", err); - } - - framingCtx->duration = 0; - framingCtx->previousClipTime = -1; - framingCtx->previewOffsetClipTime = -1; - - /** - * Only one element in the chained list (no animated image with RGB buffer...) */ - framingCtx->pCurrent = framingCtx; - framingCtx->pNext = framingCtx; - - return M4NO_ERROR; -} - -M4OSA_ERR M4xVSS_internalSetPlaneTransparent(M4OSA_UInt8* planeIn, M4OSA_UInt32 size) -{ - M4OSA_UInt32 i; - M4OSA_UInt8* plane = planeIn; - M4OSA_UInt8 transparent1 = (M4OSA_UInt8)((TRANSPARENT_COLOR & 0xFF00)>>8); - M4OSA_UInt8 transparent2 = (M4OSA_UInt8)TRANSPARENT_COLOR; - - for(i=0; i<(size>>1); i++) - { - *plane++ = transparent1; - *plane++ = transparent2; - } - - return M4NO_ERROR; -} - - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalConvertARBG888toYUV420_FrammingEffect(M4OSA_Context pContext, - * M4VSS3GPP_EffectSettings* pEffect, - * M4xVSS_FramingStruct* framingCtx, - M4VIDEOEDITING_VideoFrameSize OutputVideoResolution) - * - * @brief This function converts ARGB8888 input file to YUV420 whenused for framming effect - * @note The input ARGB8888 file path is contained in the pEffect structure - * If the ARGB8888 must be resized to fit output video size, this function - * will do it. - * @param pContext (IN) The integrator own context - * @param pEffect (IN) The effect structure containing all informations on - * the file to decode, resizing ... - * @param framingCtx (IN/OUT) Structure in which the output RGB will be stored - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - * @return M4ERR_ALLOC: Allocation error (no more memory) - * @return M4ERR_FILE_NOT_FOUND: File not found. - ****************************************************************************** - */ - - -M4OSA_ERR M4xVSS_internalConvertARGB888toYUV420_FrammingEffect(M4OSA_Context pContext, - M4VSS3GPP_EffectSettings* pEffect, - M4xVSS_FramingStruct* framingCtx, - M4VIDEOEDITING_VideoFrameSize\ - OutputVideoResolution) -{ - M4OSA_ERR err = M4NO_ERROR; - M4OSA_Context pARGBIn; - M4OSA_UInt32 file_size; - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4OSA_UInt32 width, height, width_out, height_out; - M4OSA_Void* pFile = pEffect->xVSS.pFramingFilePath; - M4OSA_UInt8 transparent1 = (M4OSA_UInt8)((TRANSPARENT_COLOR & 0xFF00)>>8); - M4OSA_UInt8 transparent2 = (M4OSA_UInt8)TRANSPARENT_COLOR; - /*UTF conversion support*/ - M4OSA_Char* pDecodedPath = M4OSA_NULL; - M4OSA_UInt32 i = 0,j = 0; - M4VIFI_ImagePlane rgbPlane; - M4OSA_UInt32 frameSize_argb=(framingCtx->width * framingCtx->height * 4); - M4OSA_UInt32 frameSize; - M4OSA_UInt32 tempAlphaPercent = 0; - M4VIFI_UInt8* TempPacData = M4OSA_NULL; - M4OSA_UInt16 *ptr = M4OSA_NULL; - M4OSA_UInt32 z = 0; - - M4OSA_TRACE3_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect: Entering "); - - M4OSA_TRACE1_2("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect width and height %d %d ", - framingCtx->width,framingCtx->height); - - M4OSA_UInt8 *pTmpData = (M4OSA_UInt8*) M4OSA_32bitAlignedMalloc(frameSize_argb, M4VS, (M4OSA_Char*)\ - "Image argb data"); - if(pTmpData == M4OSA_NULL) { - M4OSA_TRACE1_0("Failed to allocate memory for Image clip"); - return M4ERR_ALLOC; - } - /** - * UTF conversion: convert the file path into the customer format*/ - pDecodedPath = pFile; - - if(xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer != M4OSA_NULL) - { - M4OSA_UInt32 length = 0; - err = M4xVSS_internalConvertFromUTF8(xVSS_context, (M4OSA_Void*) pFile, - (M4OSA_Void*) xVSS_context->UTFConversionContext.pTempOutConversionBuffer, &length); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalDecodePNG:\ - M4xVSS_internalConvertFromUTF8 returns err: 0x%x",err); - free(pTmpData); - pTmpData = M4OSA_NULL; - return err; - } - pDecodedPath = xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - - /** - * End of the conversion, now use the decoded path*/ - - /* Open input ARGB8888 file and store it into memory */ - err = xVSS_context->pFileReadPtr->openRead(&pARGBIn, pDecodedPath, M4OSA_kFileRead); - - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_2("Can't open input ARGB8888 file %s, error: 0x%x\n",pFile, err); - free(pTmpData); - pTmpData = M4OSA_NULL; - return err; - } - - err = xVSS_context->pFileReadPtr->readData(pARGBIn,(M4OSA_MemAddr8)pTmpData, &frameSize_argb); - if(err != M4NO_ERROR) - { - xVSS_context->pFileReadPtr->closeRead(pARGBIn); - free(pTmpData); - pTmpData = M4OSA_NULL; - return err; - } - - - err = xVSS_context->pFileReadPtr->closeRead(pARGBIn); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_2("Can't close input png file %s, error: 0x%x\n",pFile, err); - free(pTmpData); - pTmpData = M4OSA_NULL; - return err; - } - - - rgbPlane.u_height = framingCtx->height; - rgbPlane.u_width = framingCtx->width; - rgbPlane.u_stride = rgbPlane.u_width*3; - rgbPlane.u_topleft = 0; - - frameSize = (rgbPlane.u_width * rgbPlane.u_height * 3); //Size of RGB888 data - rgbPlane.pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(((frameSize)+ (2 * framingCtx->width)), - M4VS, (M4OSA_Char*)"Image clip RGB888 data"); - if(rgbPlane.pac_data == M4OSA_NULL) - { - M4OSA_TRACE1_0("Failed to allocate memory for Image clip"); - free(pTmpData); - return M4ERR_ALLOC; - } - - M4OSA_TRACE1_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect:\ - Remove the alpha channel "); - - /* premultiplied alpha % on RGB */ - for (i=0, j = 0; i < frameSize_argb; i += 4) { - /* this is alpha value */ - if ((i % 4) == 0) - { - tempAlphaPercent = pTmpData[i]; - } - - /* R */ - rgbPlane.pac_data[j] = pTmpData[i+1]; - j++; - - /* G */ - if (tempAlphaPercent > 0) { - rgbPlane.pac_data[j] = pTmpData[i+2]; - j++; - } else {/* In case of alpha value 0, make GREEN to 255 */ - rgbPlane.pac_data[j] = 255; //pTmpData[i+2]; - j++; - } - - /* B */ - rgbPlane.pac_data[j] = pTmpData[i+3]; - j++; - } - - free(pTmpData); - pTmpData = M4OSA_NULL; - - /* convert RGB888 to RGB565 */ - - /* allocate temp RGB 565 buffer */ - TempPacData = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(frameSize + - (4 * (framingCtx->width + framingCtx->height + 1)), - M4VS, (M4OSA_Char*)"Image clip RGB565 data"); - if (TempPacData == M4OSA_NULL) { - M4OSA_TRACE1_0("Failed to allocate memory for Image clip RGB565 data"); - free(rgbPlane.pac_data); - return M4ERR_ALLOC; - } - - ptr = (M4OSA_UInt16 *)TempPacData; - z = 0; - - for (i = 0; i < j ; i += 3) - { - ptr[z++] = PACK_RGB565(0, rgbPlane.pac_data[i], - rgbPlane.pac_data[i+1], - rgbPlane.pac_data[i+2]); - } - - /* free the RBG888 and assign RGB565 */ - free(rgbPlane.pac_data); - rgbPlane.pac_data = TempPacData; - - /** - * Check if output sizes are odd */ - if(rgbPlane.u_height % 2 != 0) - { - M4VIFI_UInt8* output_pac_data = rgbPlane.pac_data; - M4OSA_UInt32 i; - M4OSA_TRACE1_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect:\ - output height is odd "); - output_pac_data +=rgbPlane.u_width * rgbPlane.u_height*2; - - for(i=0;i<rgbPlane.u_width;i++) - { - *output_pac_data++ = transparent1; - *output_pac_data++ = transparent2; - } - - /** - * We just add a white line to the PNG that will be transparent */ - rgbPlane.u_height++; - } - if(rgbPlane.u_width % 2 != 0) - { - /** - * We add a new column of white (=transparent), but we need to parse all RGB lines ... */ - M4OSA_UInt32 i; - M4VIFI_UInt8* newRGBpac_data; - M4VIFI_UInt8* output_pac_data, *input_pac_data; - - rgbPlane.u_width++; - M4OSA_TRACE1_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect: \ - output width is odd "); - /** - * We need to allocate a new RGB output buffer in which all decoded data - + white line will be copied */ - newRGBpac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(rgbPlane.u_height*rgbPlane.u_width*2\ - *sizeof(M4VIFI_UInt8), M4VS, (M4OSA_Char *)"New Framing GIF Output pac_data RGB"); - - if(newRGBpac_data == M4OSA_NULL) - { - M4OSA_TRACE1_0("Allocation error in \ - M4xVSS_internalConvertARGB888toYUV420_FrammingEffect"); - free(rgbPlane.pac_data); - return M4ERR_ALLOC; - } - - output_pac_data= newRGBpac_data; - input_pac_data = rgbPlane.pac_data; - - for(i=0;i<rgbPlane.u_height;i++) - { - memcpy((void *)output_pac_data, (void *)input_pac_data, - (rgbPlane.u_width-1)*2); - - output_pac_data += ((rgbPlane.u_width-1)*2); - /* Put the pixel to transparency color */ - *output_pac_data++ = transparent1; - *output_pac_data++ = transparent2; - - input_pac_data += ((rgbPlane.u_width-1)*2); - } - free(rgbPlane.pac_data); - rgbPlane.pac_data = newRGBpac_data; - } - - /* reset stride */ - rgbPlane.u_stride = rgbPlane.u_width*2; - - /** - * Initialize chained list parameters */ - framingCtx->duration = 0; - framingCtx->previousClipTime = -1; - framingCtx->previewOffsetClipTime = -1; - - /** - * Only one element in the chained list (no animated image ...) */ - framingCtx->pCurrent = framingCtx; - framingCtx->pNext = framingCtx; - - /** - * Get output width/height */ - switch(OutputVideoResolution) - //switch(xVSS_context->pSettings->xVSS.outputVideoSize) - { - case M4VIDEOEDITING_kSQCIF: - width_out = 128; - height_out = 96; - break; - case M4VIDEOEDITING_kQQVGA: - width_out = 160; - height_out = 120; - break; - case M4VIDEOEDITING_kQCIF: - width_out = 176; - height_out = 144; - break; - case M4VIDEOEDITING_kQVGA: - width_out = 320; - height_out = 240; - break; - case M4VIDEOEDITING_kCIF: - width_out = 352; - height_out = 288; - break; - case M4VIDEOEDITING_kVGA: - width_out = 640; - height_out = 480; - break; - case M4VIDEOEDITING_kWVGA: - width_out = 800; - height_out = 480; - break; - case M4VIDEOEDITING_kNTSC: - width_out = 720; - height_out = 480; - break; - case M4VIDEOEDITING_k640_360: - width_out = 640; - height_out = 360; - break; - case M4VIDEOEDITING_k854_480: - // StageFright encoders require %16 resolution - width_out = M4ENCODER_854_480_Width; - height_out = 480; - break; - case M4VIDEOEDITING_k1280_720: - width_out = 1280; - height_out = 720; - break; - case M4VIDEOEDITING_k1080_720: - // StageFright encoders require %16 resolution - width_out = M4ENCODER_1080_720_Width; - height_out = 720; - break; - case M4VIDEOEDITING_k960_720: - width_out = 960; - height_out = 720; - break; - case M4VIDEOEDITING_k1920_1080: - width_out = 1920; - height_out = M4ENCODER_1920_1080_Height; - break; - /** - * If output video size is not given, we take QCIF size, - * should not happen, because already done in M4xVSS_sendCommand */ - default: - width_out = 176; - height_out = 144; - break; - } - - /** - * Allocate output planes structures */ - framingCtx->FramingRgb = (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc(sizeof(M4VIFI_ImagePlane), M4VS, - (M4OSA_Char *)"Framing Output plane RGB"); - if(framingCtx->FramingRgb == M4OSA_NULL) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertARGB888toYUV420_FrammingEffect"); - return M4ERR_ALLOC; - } - /** - * Resize RGB if needed */ - if((pEffect->xVSS.bResize) && - (rgbPlane.u_width != width_out || rgbPlane.u_height != height_out)) - { - width = width_out; - height = height_out; - - M4OSA_TRACE1_2("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect: \ - New Width and height %d %d ",width,height); - - framingCtx->FramingRgb->u_height = height_out; - framingCtx->FramingRgb->u_width = width_out; - framingCtx->FramingRgb->u_stride = framingCtx->FramingRgb->u_width*2; - framingCtx->FramingRgb->u_topleft = 0; - - framingCtx->FramingRgb->pac_data = - (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(framingCtx->FramingRgb->u_height*framingCtx->\ - FramingRgb->u_width*2*sizeof(M4VIFI_UInt8), M4VS, - (M4OSA_Char *)"Framing Output pac_data RGB"); - - if(framingCtx->FramingRgb->pac_data == M4OSA_NULL) - { - M4OSA_TRACE1_0("Allocation error in \ - M4xVSS_internalConvertARGB888toYUV420_FrammingEffect"); - free(framingCtx->FramingRgb); - free(rgbPlane.pac_data); - return M4ERR_ALLOC; - } - - M4OSA_TRACE1_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect: Resizing Needed "); - M4OSA_TRACE1_2("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect:\ - rgbPlane.u_height & rgbPlane.u_width %d %d",rgbPlane.u_height,rgbPlane.u_width); - - //err = M4VIFI_ResizeBilinearRGB888toRGB888(M4OSA_NULL, &rgbPlane,framingCtx->FramingRgb); - err = M4VIFI_ResizeBilinearRGB565toRGB565(M4OSA_NULL, &rgbPlane,framingCtx->FramingRgb); - - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect :\ - when resizing RGB plane: 0x%x\n", err); - return err; - } - - if(rgbPlane.pac_data != M4OSA_NULL) - { - free(rgbPlane.pac_data); - rgbPlane.pac_data = M4OSA_NULL; - } - } - else - { - - M4OSA_TRACE1_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect:\ - Resizing Not Needed "); - - width = rgbPlane.u_width; - height = rgbPlane.u_height; - framingCtx->FramingRgb->u_height = height; - framingCtx->FramingRgb->u_width = width; - framingCtx->FramingRgb->u_stride = framingCtx->FramingRgb->u_width*2; - framingCtx->FramingRgb->u_topleft = 0; - framingCtx->FramingRgb->pac_data = rgbPlane.pac_data; - } - - - if(pEffect->xVSS.bResize) - { - /** - * Force topleft to 0 for pure framing effect */ - framingCtx->topleft_x = 0; - framingCtx->topleft_y = 0; - } - - - /** - * Convert RGB output to YUV 420 to be able to merge it with output video in framing - effect */ - framingCtx->FramingYuv = (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc(3*sizeof(M4VIFI_ImagePlane), M4VS, - (M4OSA_Char *)"Framing Output plane YUV"); - if(framingCtx->FramingYuv == M4OSA_NULL) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertARGB888toYUV420_FrammingEffect"); - free(framingCtx->FramingRgb->pac_data); - return M4ERR_ALLOC; - } - - // Alloc for Y, U and V planes - framingCtx->FramingYuv[0].u_width = ((width+1)>>1)<<1; - framingCtx->FramingYuv[0].u_height = ((height+1)>>1)<<1; - framingCtx->FramingYuv[0].u_topleft = 0; - framingCtx->FramingYuv[0].u_stride = ((width+1)>>1)<<1; - framingCtx->FramingYuv[0].pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc - ((framingCtx->FramingYuv[0].u_width*framingCtx->FramingYuv[0].u_height), M4VS, - (M4OSA_Char *)"Alloc for the output Y"); - if(framingCtx->FramingYuv[0].pac_data == M4OSA_NULL) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertARGB888toYUV420_FrammingEffect"); - free(framingCtx->FramingYuv); - free(framingCtx->FramingRgb->pac_data); - return M4ERR_ALLOC; - } - framingCtx->FramingYuv[1].u_width = (((width+1)>>1)<<1)>>1; - framingCtx->FramingYuv[1].u_height = (((height+1)>>1)<<1)>>1; - framingCtx->FramingYuv[1].u_topleft = 0; - framingCtx->FramingYuv[1].u_stride = (((width+1)>>1)<<1)>>1; - - - framingCtx->FramingYuv[1].pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc( - framingCtx->FramingYuv[1].u_width * framingCtx->FramingYuv[1].u_height, M4VS, - (M4OSA_Char *)"Alloc for the output U"); - if (framingCtx->FramingYuv[1].pac_data == M4OSA_NULL) { - free(framingCtx->FramingYuv[0].pac_data); - free(framingCtx->FramingYuv); - free(framingCtx->FramingRgb->pac_data); - return M4ERR_ALLOC; - } - - framingCtx->FramingYuv[2].u_width = (((width+1)>>1)<<1)>>1; - framingCtx->FramingYuv[2].u_height = (((height+1)>>1)<<1)>>1; - framingCtx->FramingYuv[2].u_topleft = 0; - framingCtx->FramingYuv[2].u_stride = (((width+1)>>1)<<1)>>1; - - - framingCtx->FramingYuv[2].pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc( - framingCtx->FramingYuv[2].u_width * framingCtx->FramingYuv[0].u_height, M4VS, - (M4OSA_Char *)"Alloc for the output V"); - if (framingCtx->FramingYuv[2].pac_data == M4OSA_NULL) { - free(framingCtx->FramingYuv[1].pac_data); - free(framingCtx->FramingYuv[0].pac_data); - free(framingCtx->FramingYuv); - free(framingCtx->FramingRgb->pac_data); - return M4ERR_ALLOC; - } - - M4OSA_TRACE3_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect:\ - convert RGB to YUV "); - - //err = M4VIFI_RGB888toYUV420(M4OSA_NULL, framingCtx->FramingRgb, framingCtx->FramingYuv); - err = M4VIFI_RGB565toYUV420(M4OSA_NULL, framingCtx->FramingRgb, framingCtx->FramingYuv); - - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("SPS png: error when converting from RGB to YUV: 0x%x\n", err); - } - M4OSA_TRACE3_0("M4xVSS_internalConvertARGB888toYUV420_FrammingEffect: Leaving "); - return err; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalGenerateEditedFile(M4OSA_Context pContext) - * - * @brief This function prepares VSS for editing - * @note It also set special xVSS effect as external effects for the VSS - * @param pContext (IN) The integrator own context - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - * @return M4ERR_ALLOC: Allocation error (no more memory) - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalGenerateEditedFile(M4OSA_Context pContext) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4VSS3GPP_EditContext pVssCtxt; - M4OSA_UInt32 i,j; - M4OSA_ERR err; - - /** - * Create a VSS 3GPP edition instance */ - err = M4VSS3GPP_editInit( &pVssCtxt, xVSS_context->pFileReadPtr, xVSS_context->pFileWritePtr); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalGenerateEditedFile: M4VSS3GPP_editInit returned 0x%x\n", - err); - M4VSS3GPP_editCleanUp(pVssCtxt); - /** - * Set the VSS context to NULL */ - xVSS_context->pCurrentEditContext = M4OSA_NULL; - return err; - } - - M4VSS3GPP_InternalEditContext* pVSSContext = - (M4VSS3GPP_InternalEditContext*)pVssCtxt; - pVSSContext->xVSS.outputVideoFormat = - xVSS_context->pSettings->xVSS.outputVideoFormat; - pVSSContext->xVSS.outputVideoSize = - xVSS_context->pSettings->xVSS.outputVideoSize ; - pVSSContext->xVSS.outputAudioFormat = - xVSS_context->pSettings->xVSS.outputAudioFormat; - pVSSContext->xVSS.outputAudioSamplFreq = - xVSS_context->pSettings->xVSS.outputAudioSamplFreq; - pVSSContext->xVSS.outputVideoBitrate = - xVSS_context->pSettings->xVSS.outputVideoBitrate ; - pVSSContext->xVSS.outputAudioBitrate = - xVSS_context->pSettings->xVSS.outputAudioBitrate ; - pVSSContext->xVSS.bAudioMono = - xVSS_context->pSettings->xVSS.bAudioMono; - pVSSContext->xVSS.outputVideoProfile = - xVSS_context->pSettings->xVSS.outputVideoProfile; - pVSSContext->xVSS.outputVideoLevel = - xVSS_context->pSettings->xVSS.outputVideoLevel; - /* In case of MMS use case, we fill directly into the VSS context the targeted bitrate */ - if(xVSS_context->targetedBitrate != 0) - { - M4VSS3GPP_InternalEditContext* pVSSContext = (M4VSS3GPP_InternalEditContext*)pVssCtxt; - - pVSSContext->bIsMMS = M4OSA_TRUE; - pVSSContext->uiMMSVideoBitrate = xVSS_context->targetedBitrate; - pVSSContext->MMSvideoFramerate = xVSS_context->pSettings->videoFrameRate; - } - - /*Warning: since the adding of the UTF conversion, pSettings has been changed in the next - part in pCurrentEditSettings (there is a specific current editing structure for the saving, - as for the preview)*/ - - /** - * Set the external video effect functions, for saving mode (to be moved to - M4xVSS_saveStart() ?)*/ - for (i=0; i<xVSS_context->pCurrentEditSettings->uiClipNumber; i++) - { - for (j=0; j<xVSS_context->pCurrentEditSettings->nbEffects; j++) - { - if (M4xVSS_kVideoEffectType_BlackAndWhite == - xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType) - { - xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct = - M4VSS3GPP_externalVideoEffectColor; - //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt = - // (M4OSA_Void*)M4xVSS_kVideoEffectType_BlackAndWhite; - /*commented FB*/ - /** - * We do not need to set the color context, it is already set - during sendCommand function */ - } - if (M4xVSS_kVideoEffectType_Pink == - xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType) - { - xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct = - M4VSS3GPP_externalVideoEffectColor; - //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt = - // (M4OSA_Void*)M4xVSS_kVideoEffectType_Pink; /**< we don't - // use any function context */ - /*commented FB*/ - /** - * We do not need to set the color context, - it is already set during sendCommand function */ - } - if (M4xVSS_kVideoEffectType_Green == - xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType) - { - xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct = - M4VSS3GPP_externalVideoEffectColor; - //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt = - // (M4OSA_Void*)M4xVSS_kVideoEffectType_Green; - /**< we don't use any function context */ - /*commented FB*/ - /** - * We do not need to set the color context, it is already set during - sendCommand function */ - } - if (M4xVSS_kVideoEffectType_Sepia == - xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType) - { - xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct = - M4VSS3GPP_externalVideoEffectColor; - //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt = - // (M4OSA_Void*)M4xVSS_kVideoEffectType_Sepia; - /**< we don't use any function context */ - /*commented FB*/ - /** - * We do not need to set the color context, it is already set during - sendCommand function */ - } - if (M4xVSS_kVideoEffectType_Fifties == - xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType) - { - xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct = - M4VSS3GPP_externalVideoEffectFifties; - /** - * We do not need to set the framing context, it is already set during - sendCommand function */ - } - if (M4xVSS_kVideoEffectType_Negative == - xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType) - { - xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct = - M4VSS3GPP_externalVideoEffectColor; - //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt = - // (M4OSA_Void*)M4xVSS_kVideoEffectType_Negative; - /**< we don't use any function context */ - /*commented FB*/ - /** - * We do not need to set the color context, it is already set during - sendCommand function */ - } - if (M4xVSS_kVideoEffectType_Framing == - xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType) - { - xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct = - M4VSS3GPP_externalVideoEffectFraming; - /** - * We do not need to set the framing context, it is already set during - sendCommand function */ - } - if (M4xVSS_kVideoEffectType_ZoomIn == - xVSS_context->pSettings->Effects[j].VideoEffectType) - { - xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct = - M4VSS3GPP_externalVideoEffectZoom; - xVSS_context->pCurrentEditSettings->Effects[j].pExtVideoEffectFctCtxt = - (M4OSA_Void*)M4xVSS_kVideoEffectType_ZoomIn; /**< we don't use any - function context */ - } - if (M4xVSS_kVideoEffectType_ZoomOut == - xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType) - { - xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct = - M4VSS3GPP_externalVideoEffectZoom; - xVSS_context->pCurrentEditSettings->Effects[j].pExtVideoEffectFctCtxt = - (M4OSA_Void*)M4xVSS_kVideoEffectType_ZoomOut; /**< we don't use any - function context */ - } - if (M4xVSS_kVideoEffectType_ColorRGB16 == - xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType) - { - xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct = - M4VSS3GPP_externalVideoEffectColor; - //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt = - // (M4OSA_Void*)M4xVSS_kVideoEffectType_ColorRGB16; - /**< we don't use any function context */ - /** - * We do not need to set the color context, it is already set during - sendCommand function */ - } - if (M4xVSS_kVideoEffectType_Gradient == - xVSS_context->pCurrentEditSettings->Effects[j].VideoEffectType) - { - xVSS_context->pCurrentEditSettings->Effects[j].ExtVideoEffectFct = - M4VSS3GPP_externalVideoEffectColor; - //xVSS_context->pSettings->Effects[j].pExtVideoEffectFctCtxt = - // (M4OSA_Void*)M4xVSS_kVideoEffectType_ColorRGB16; - /**< we don't use any function context */ - /** - * We do not need to set the color context, it is already set during - sendCommand function */ - } - - } - } - - /** - * Open the VSS 3GPP */ - err = M4VSS3GPP_editOpen(pVssCtxt, xVSS_context->pCurrentEditSettings); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalGenerateEditedFile:\ - M4VSS3GPP_editOpen returned 0x%x\n",err); - M4VSS3GPP_editCleanUp(pVssCtxt); - /** - * Set the VSS context to NULL */ - xVSS_context->pCurrentEditContext = M4OSA_NULL; - return err; - } - - /** - * Save VSS context to be able to close / free VSS later */ - xVSS_context->pCurrentEditContext = pVssCtxt; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalCloseEditedFile(M4OSA_Context pContext) - * - * @brief This function cleans up VSS - * @note - * @param pContext (IN) The integrator own context - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalCloseEditedFile(M4OSA_Context pContext) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4VSS3GPP_EditContext pVssCtxt = xVSS_context->pCurrentEditContext; - M4OSA_ERR err; - - if(xVSS_context->pCurrentEditContext != M4OSA_NULL) - { - /** - * Close the VSS 3GPP */ - err = M4VSS3GPP_editClose(pVssCtxt); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalCloseEditedFile:\ - M4VSS3GPP_editClose returned 0x%x\n",err); - M4VSS3GPP_editCleanUp(pVssCtxt); - /** - * Set the VSS context to NULL */ - xVSS_context->pCurrentEditContext = M4OSA_NULL; - return err; - } - - /** - * Free this VSS3GPP edition instance */ - err = M4VSS3GPP_editCleanUp(pVssCtxt); - /** - * Set the VSS context to NULL */ - xVSS_context->pCurrentEditContext = M4OSA_NULL; - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalCloseEditedFile: \ - M4VSS3GPP_editCleanUp returned 0x%x\n",err); - return err; - } - } - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalGenerateAudioMixFile(M4OSA_Context pContext) - * - * @brief This function prepares VSS for audio mixing - * @note It takes its parameters from the BGM settings in the xVSS internal context - * @param pContext (IN) The integrator own context - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - * @return M4ERR_ALLOC: Allocation error (no more memory) - ****************************************************************************** - */ -/*** - * FB: the function has been modified since the structure used for the saving is now the - * pCurrentEditSettings and not the pSettings - * This change has been added for the UTF support - * All the "xVSS_context->pSettings" has been replaced by "xVSS_context->pCurrentEditSettings" - ***/ -M4OSA_ERR M4xVSS_internalGenerateAudioMixFile(M4OSA_Context pContext) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4VSS3GPP_AudioMixingSettings* pAudioMixSettings; - M4VSS3GPP_AudioMixingContext pAudioMixingCtxt; - M4OSA_ERR err; - M4VIDEOEDITING_ClipProperties fileProperties; - - /** - * Allocate audio mixing settings structure and fill it with BGM parameters */ - pAudioMixSettings = (M4VSS3GPP_AudioMixingSettings*)M4OSA_32bitAlignedMalloc - (sizeof(M4VSS3GPP_AudioMixingSettings), M4VS, (M4OSA_Char *)"pAudioMixSettings"); - if(pAudioMixSettings == M4OSA_NULL) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_internalGenerateAudioMixFile"); - return M4ERR_ALLOC; - } - - if(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->FileType == - M4VIDEOEDITING_kFileType_3GPP) - { - err = M4xVSS_internalGetProperties((M4OSA_Context)xVSS_context, - (M4OSA_Char*)xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile, - &fileProperties); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalGenerateAudioMixFile:\ - impossible to retrieve audio BGM properties ->\ - reencoding audio background music", err); - fileProperties.AudioStreamType = - xVSS_context->pCurrentEditSettings->xVSS.outputAudioFormat+1; - /* To force BGM encoding */ - } - } - - pAudioMixSettings->bRemoveOriginal = M4OSA_FALSE; - pAudioMixSettings->AddedAudioFileType = - xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->FileType; - pAudioMixSettings->pAddedAudioTrackFile = - xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile; - pAudioMixSettings->uiAddVolume = - xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->uiAddVolume; - - pAudioMixSettings->outputAudioFormat = xVSS_context->pSettings->xVSS.outputAudioFormat; - pAudioMixSettings->outputASF = xVSS_context->pSettings->xVSS.outputAudioSamplFreq; - pAudioMixSettings->outputAudioBitrate = xVSS_context->pSettings->xVSS.outputAudioBitrate; - pAudioMixSettings->uiSamplingFrequency = - xVSS_context->pSettings->xVSS.pBGMtrack->uiSamplingFrequency; - pAudioMixSettings->uiNumChannels = xVSS_context->pSettings->xVSS.pBGMtrack->uiNumChannels; - - pAudioMixSettings->b_DuckingNeedeed = - xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->b_DuckingNeedeed; - pAudioMixSettings->fBTVolLevel = - (M4OSA_Float )xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->uiAddVolume/100; - pAudioMixSettings->InDucking_threshold = - xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->InDucking_threshold; - pAudioMixSettings->InDucking_lowVolume = - xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->lowVolume/100; - pAudioMixSettings->fPTVolLevel = - (M4OSA_Float)xVSS_context->pSettings->PTVolLevel/100; - pAudioMixSettings->bLoop = xVSS_context->pSettings->xVSS.pBGMtrack->bLoop; - - if(xVSS_context->pSettings->xVSS.bAudioMono) - { - pAudioMixSettings->outputNBChannels = 1; - } - else - { - pAudioMixSettings->outputNBChannels = 2; - } - - /** - * Fill audio mix settings with BGM parameters */ - pAudioMixSettings->uiBeginLoop = - xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->uiBeginLoop; - pAudioMixSettings->uiEndLoop = - xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->uiEndLoop; - pAudioMixSettings->uiAddCts = - xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->uiAddCts; - - /** - * Output file of the audio mixer will be final file (audio mixing is the last step) */ - pAudioMixSettings->pOutputClipFile = xVSS_context->pOutputFile; - pAudioMixSettings->pTemporaryFile = xVSS_context->pTemporaryFile; - - /** - * Input file of the audio mixer is a temporary file containing all audio/video editions */ - pAudioMixSettings->pOriginalClipFile = xVSS_context->pCurrentEditSettings->pOutputFile; - - /** - * Save audio mixing settings pointer to be able to free it in - M4xVSS_internalCloseAudioMixedFile function */ - xVSS_context->pAudioMixSettings = pAudioMixSettings; - - /** - * Create a VSS 3GPP audio mixing instance */ - err = M4VSS3GPP_audioMixingInit(&pAudioMixingCtxt, pAudioMixSettings, - xVSS_context->pFileReadPtr, xVSS_context->pFileWritePtr); - - /** - * Save audio mixing context to be able to call audio mixing step function in - M4xVSS_step function */ - xVSS_context->pAudioMixContext = pAudioMixingCtxt; - - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalGenerateAudioMixFile:\ - M4VSS3GPP_audioMixingInit returned 0x%x\n",err); - //M4VSS3GPP_audioMixingCleanUp(pAudioMixingCtxt); - return err; - } - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalCloseAudioMixedFile(M4OSA_Context pContext) - * - * @brief This function cleans up VSS for audio mixing - * @note - * @param pContext (IN) The integrator own context - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalCloseAudioMixedFile(M4OSA_Context pContext) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4OSA_ERR err; - - /** - * Free this VSS3GPP audio mixing instance */ - if(xVSS_context->pAudioMixContext != M4OSA_NULL) - { - err = M4VSS3GPP_audioMixingCleanUp(xVSS_context->pAudioMixContext); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalCloseAudioMixedFile:\ - M4VSS3GPP_audioMixingCleanUp returned 0x%x\n",err); - return err; - } - } - - /** - * Free VSS audio mixing settings */ - if(xVSS_context->pAudioMixSettings != M4OSA_NULL) - { - free(xVSS_context->pAudioMixSettings); - xVSS_context->pAudioMixSettings = M4OSA_NULL; - } - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalFreePreview(M4OSA_Context pContext) - * - * @brief This function cleans up preview edition structure used to generate - * preview.3gp file given to the VPS - * @note It also free the preview structure given to the VPS - * @param pContext (IN) The integrator own context - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalFreePreview(M4OSA_Context pContext) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4OSA_UInt8 i; - - /** - * Free clip/transition settings */ - for(i=0; i<xVSS_context->pCurrentEditSettings->uiClipNumber; i++) - { - M4xVSS_FreeClipSettings(xVSS_context->pCurrentEditSettings->pClipList[i]); - - free((xVSS_context->pCurrentEditSettings->pClipList[i])); - xVSS_context->pCurrentEditSettings->pClipList[i] = M4OSA_NULL; - - /** - * Because there is 1 less transition than clip number */ - if(i != xVSS_context->pCurrentEditSettings->uiClipNumber-1) - { - free((xVSS_context->pCurrentEditSettings->pTransitionList[i])); - xVSS_context->pCurrentEditSettings->pTransitionList[i] = M4OSA_NULL; - } - } - - /** - * Free clip/transition list */ - if(xVSS_context->pCurrentEditSettings->pClipList != M4OSA_NULL) - { - free((xVSS_context->pCurrentEditSettings->pClipList)); - xVSS_context->pCurrentEditSettings->pClipList = M4OSA_NULL; - } - if(xVSS_context->pCurrentEditSettings->pTransitionList != M4OSA_NULL) - { - free((xVSS_context->pCurrentEditSettings->pTransitionList)); - xVSS_context->pCurrentEditSettings->pTransitionList = M4OSA_NULL; - } - - /** - * Free output preview file path */ - if(xVSS_context->pCurrentEditSettings->pOutputFile != M4OSA_NULL) - { - free(xVSS_context->pCurrentEditSettings->pOutputFile); - xVSS_context->pCurrentEditSettings->pOutputFile = M4OSA_NULL; - } - - /** - * Free temporary preview file path */ - if(xVSS_context->pCurrentEditSettings->pTemporaryFile != M4OSA_NULL) - { - remove((const char *)xVSS_context->pCurrentEditSettings->pTemporaryFile); - free(xVSS_context->pCurrentEditSettings->pTemporaryFile); - xVSS_context->pCurrentEditSettings->pTemporaryFile = M4OSA_NULL; - } - - /** - * Free "local" BGM settings */ - if(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack != M4OSA_NULL) - { - if(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile != M4OSA_NULL) - { - free(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile); - xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile = M4OSA_NULL; - } - free(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack); - xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack = M4OSA_NULL; - } - - /** - * Free current edit settings structure */ - if(xVSS_context->pCurrentEditSettings != M4OSA_NULL) - { - free(xVSS_context->pCurrentEditSettings); - xVSS_context->pCurrentEditSettings = M4OSA_NULL; - } - - /** - * Free preview effects given to application */ - if(M4OSA_NULL != xVSS_context->pPreviewSettings->Effects) - { - free(xVSS_context->pPreviewSettings->Effects); - xVSS_context->pPreviewSettings->Effects = M4OSA_NULL; - xVSS_context->pPreviewSettings->nbEffects = 0; - } - - return M4NO_ERROR; -} - - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalFreeSaving(M4OSA_Context pContext) - * - * @brief This function cleans up saving edition structure used to generate - * output.3gp file given to the VPS - * @note - * @param pContext (IN) The integrator own context - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalFreeSaving(M4OSA_Context pContext) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4OSA_UInt8 i; - - if(xVSS_context->pCurrentEditSettings != M4OSA_NULL) - { - /** - * Free clip/transition settings */ - for(i=0; i<xVSS_context->pCurrentEditSettings->uiClipNumber; i++) - { - M4xVSS_FreeClipSettings(xVSS_context->pCurrentEditSettings->pClipList[i]); - - free((xVSS_context->pCurrentEditSettings->pClipList[i])); - xVSS_context->pCurrentEditSettings->pClipList[i] = M4OSA_NULL; - - /** - * Because there is 1 less transition than clip number */ - if(i != xVSS_context->pCurrentEditSettings->uiClipNumber-1) - { - free(\ - (xVSS_context->pCurrentEditSettings->pTransitionList[i])); - xVSS_context->pCurrentEditSettings->pTransitionList[i] = M4OSA_NULL; - } - } - - /** - * Free clip/transition list */ - if(xVSS_context->pCurrentEditSettings->pClipList != M4OSA_NULL) - { - free((xVSS_context->pCurrentEditSettings->pClipList)); - xVSS_context->pCurrentEditSettings->pClipList = M4OSA_NULL; - } - if(xVSS_context->pCurrentEditSettings->pTransitionList != M4OSA_NULL) - { - free((xVSS_context->pCurrentEditSettings->pTransitionList)); - xVSS_context->pCurrentEditSettings->pTransitionList = M4OSA_NULL; - } - - if(xVSS_context->pCurrentEditSettings->Effects != M4OSA_NULL) - { - free((xVSS_context->pCurrentEditSettings->Effects)); - xVSS_context->pCurrentEditSettings->Effects = M4OSA_NULL; - xVSS_context->pCurrentEditSettings->nbEffects = 0; - } - - /** - * Free output saving file path */ - if(xVSS_context->pCurrentEditSettings->pOutputFile != M4OSA_NULL) - { - if(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack != M4OSA_NULL) - { - remove((const char *)xVSS_context->pCurrentEditSettings->pOutputFile); - free(xVSS_context->pCurrentEditSettings->pOutputFile); - } - if(xVSS_context->pOutputFile != M4OSA_NULL) - { - free(xVSS_context->pOutputFile); - xVSS_context->pOutputFile = M4OSA_NULL; - } - xVSS_context->pSettings->pOutputFile = M4OSA_NULL; - xVSS_context->pCurrentEditSettings->pOutputFile = M4OSA_NULL; - } - - /** - * Free temporary saving file path */ - if(xVSS_context->pCurrentEditSettings->pTemporaryFile != M4OSA_NULL) - { - remove((const char *)xVSS_context->pCurrentEditSettings->pTemporaryFile); - free(xVSS_context->pCurrentEditSettings->pTemporaryFile); - xVSS_context->pCurrentEditSettings->pTemporaryFile = M4OSA_NULL; - } - - /** - * Free "local" BGM settings */ - if(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack != M4OSA_NULL) - { - if(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile != M4OSA_NULL) - { - free(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile); - xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack->pFile = M4OSA_NULL; - } - free(xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack); - xVSS_context->pCurrentEditSettings->xVSS.pBGMtrack = M4OSA_NULL; - } - - /** - * Free current edit settings structure */ - free(xVSS_context->pCurrentEditSettings); - xVSS_context->pCurrentEditSettings = M4OSA_NULL; - } - - return M4NO_ERROR; -} - - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_freeSettings(M4OSA_Context pContext) - * - * @brief This function cleans up an M4VSS3GPP_EditSettings structure - * @note - * @param pSettings (IN) Pointer on M4VSS3GPP_EditSettings structure to free - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_freeSettings(M4VSS3GPP_EditSettings* pSettings) -{ - M4OSA_UInt8 i,j; - - /** - * For each clip ... */ - for(i=0; i<pSettings->uiClipNumber; i++) - { - /** - * ... free clip settings */ - if(pSettings->pClipList[i] != M4OSA_NULL) - { - M4xVSS_FreeClipSettings(pSettings->pClipList[i]); - - free((pSettings->pClipList[i])); - pSettings->pClipList[i] = M4OSA_NULL; - } - - /** - * ... free transition settings */ - if(i < pSettings->uiClipNumber-1) /* Because there is 1 less transition than clip number */ - { - if(pSettings->pTransitionList[i] != M4OSA_NULL) - { - switch (pSettings->pTransitionList[i]->VideoTransitionType) - { - case M4xVSS_kVideoTransitionType_AlphaMagic: - - /** - * In case of Alpha Magic transition, - some extra parameters need to be freed */ - if(pSettings->pTransitionList[i]->pExtVideoTransitionFctCtxt\ - != M4OSA_NULL) - { - free((((M4xVSS_internal_AlphaMagicSettings*)\ - pSettings->pTransitionList[i]->pExtVideoTransitionFctCtxt)->\ - pPlane->pac_data)); - ((M4xVSS_internal_AlphaMagicSettings*)pSettings->pTransitionList[i\ - ]->pExtVideoTransitionFctCtxt)->pPlane->pac_data = M4OSA_NULL; - - free((((M4xVSS_internal_AlphaMagicSettings*)\ - pSettings->pTransitionList[i]->\ - pExtVideoTransitionFctCtxt)->pPlane)); - ((M4xVSS_internal_AlphaMagicSettings*)pSettings->pTransitionList[i]\ - ->pExtVideoTransitionFctCtxt)->pPlane = M4OSA_NULL; - - free((pSettings->pTransitionList[i]->\ - pExtVideoTransitionFctCtxt)); - pSettings->pTransitionList[i]->pExtVideoTransitionFctCtxt = M4OSA_NULL; - - for(j=i+1;j<pSettings->uiClipNumber-1;j++) - { - if(pSettings->pTransitionList[j] != M4OSA_NULL) - { - if(pSettings->pTransitionList[j]->VideoTransitionType == - M4xVSS_kVideoTransitionType_AlphaMagic) - { - M4OSA_UInt32 pCmpResult=0; - pCmpResult = strcmp((const char *)pSettings->pTransitionList[i]->\ - xVSS.transitionSpecific.pAlphaMagicSettings->\ - pAlphaFilePath, - (const char *)pSettings->pTransitionList[j]->\ - xVSS.transitionSpecific.pAlphaMagicSettings->\ - pAlphaFilePath); - if(pCmpResult == 0) - { - /* Free extra internal alpha magic structure and put - it to NULL to avoid refreeing it */ - free((pSettings->\ - pTransitionList[j]->pExtVideoTransitionFctCtxt)); - pSettings->pTransitionList[j]->\ - pExtVideoTransitionFctCtxt = M4OSA_NULL; - } - } - } - } - } - - if(pSettings->pTransitionList[i]->\ - xVSS.transitionSpecific.pAlphaMagicSettings != M4OSA_NULL) - { - if(pSettings->pTransitionList[i]->\ - xVSS.transitionSpecific.pAlphaMagicSettings->\ - pAlphaFilePath != M4OSA_NULL) - { - free(pSettings->\ - pTransitionList[i]->\ - xVSS.transitionSpecific.pAlphaMagicSettings->\ - pAlphaFilePath); - pSettings->pTransitionList[i]->\ - xVSS.transitionSpecific.pAlphaMagicSettings->\ - pAlphaFilePath = M4OSA_NULL; - } - free(pSettings->pTransitionList[i]->\ - xVSS.transitionSpecific.pAlphaMagicSettings); - pSettings->pTransitionList[i]->\ - xVSS.transitionSpecific.pAlphaMagicSettings = M4OSA_NULL; - - } - - break; - - - case M4xVSS_kVideoTransitionType_SlideTransition: - if (M4OSA_NULL != pSettings->pTransitionList[i]->\ - xVSS.transitionSpecific.pSlideTransitionSettings) - { - free(pSettings->pTransitionList[i]->\ - xVSS.transitionSpecific.pSlideTransitionSettings); - pSettings->pTransitionList[i]->\ - xVSS.transitionSpecific.pSlideTransitionSettings = M4OSA_NULL; - } - if(pSettings->pTransitionList[i]->pExtVideoTransitionFctCtxt != M4OSA_NULL) - { - free((pSettings->pTransitionList[i]->\ - pExtVideoTransitionFctCtxt)); - pSettings->pTransitionList[i]->pExtVideoTransitionFctCtxt = M4OSA_NULL; - } - break; - default: - break; - - } - /** - * Free transition settings structure */ - free((pSettings->pTransitionList[i])); - pSettings->pTransitionList[i] = M4OSA_NULL; - } - } - } - - /** - * Free clip list */ - if(pSettings->pClipList != M4OSA_NULL) - { - free((pSettings->pClipList)); - pSettings->pClipList = M4OSA_NULL; - } - - /** - * Free transition list */ - if(pSettings->pTransitionList != M4OSA_NULL) - { - free((pSettings->pTransitionList)); - pSettings->pTransitionList = M4OSA_NULL; - } - - /** - * RC: Free effects list */ - if(pSettings->Effects != M4OSA_NULL) - { - for(i=0; i<pSettings->nbEffects; i++) - { - /** - * For each clip, free framing structure if needed */ - if(pSettings->Effects[i].VideoEffectType == M4xVSS_kVideoEffectType_Framing - || pSettings->Effects[i].VideoEffectType == M4xVSS_kVideoEffectType_Text) - { -#ifdef DECODE_GIF_ON_SAVING - M4xVSS_FramingContext* framingCtx = pSettings->Effects[i].pExtVideoEffectFctCtxt; -#else - M4xVSS_FramingStruct* framingCtx = pSettings->Effects[i].pExtVideoEffectFctCtxt; - M4xVSS_FramingStruct* framingCtx_save; - M4xVSS_Framing3102Struct* framingCtx_first = framingCtx; -#endif - -#ifdef DECODE_GIF_ON_SAVING - if(framingCtx != M4OSA_NULL) /* Bugfix 1.2.0: crash, trying to free non existant - pointer */ - { - if(framingCtx->aFramingCtx != M4OSA_NULL) - { - { - if(framingCtx->aFramingCtx->FramingRgb != M4OSA_NULL) - { - free(framingCtx->aFramingCtx->\ - FramingRgb->pac_data); - framingCtx->aFramingCtx->FramingRgb->pac_data = M4OSA_NULL; - free(framingCtx->aFramingCtx->FramingRgb); - framingCtx->aFramingCtx->FramingRgb = M4OSA_NULL; - } - } - if(framingCtx->aFramingCtx->FramingYuv != M4OSA_NULL) - { - free(framingCtx->aFramingCtx->\ - FramingYuv[0].pac_data); - framingCtx->aFramingCtx->FramingYuv[0].pac_data = M4OSA_NULL; - free(framingCtx->aFramingCtx->\ - FramingYuv[1].pac_data); - framingCtx->aFramingCtx->FramingYuv[1].pac_data = M4OSA_NULL; - free(framingCtx->aFramingCtx->\ - FramingYuv[2].pac_data); - framingCtx->aFramingCtx->FramingYuv[2].pac_data = M4OSA_NULL; - free(framingCtx->aFramingCtx->FramingYuv); - framingCtx->aFramingCtx->FramingYuv = M4OSA_NULL; - } - free(framingCtx->aFramingCtx); - framingCtx->aFramingCtx = M4OSA_NULL; - } - if(framingCtx->aFramingCtx_last != M4OSA_NULL) - { - if(framingCtx->aFramingCtx_last->FramingRgb != M4OSA_NULL) - { - free(framingCtx->aFramingCtx_last->\ - FramingRgb->pac_data); - framingCtx->aFramingCtx_last->FramingRgb->pac_data = M4OSA_NULL; - free(framingCtx->aFramingCtx_last->\ - FramingRgb); - framingCtx->aFramingCtx_last->FramingRgb = M4OSA_NULL; - } - if(framingCtx->aFramingCtx_last->FramingYuv != M4OSA_NULL) - { - free(framingCtx->aFramingCtx_last->\ - FramingYuv[0].pac_data); - framingCtx->aFramingCtx_last->FramingYuv[0].pac_data = M4OSA_NULL; - free(framingCtx->aFramingCtx_last->FramingYuv); - framingCtx->aFramingCtx_last->FramingYuv = M4OSA_NULL; - } - free(framingCtx->aFramingCtx_last); - framingCtx->aFramingCtx_last = M4OSA_NULL; - } - if(framingCtx->pEffectFilePath != M4OSA_NULL) - { - free(framingCtx->pEffectFilePath); - framingCtx->pEffectFilePath = M4OSA_NULL; - } - /*In case there are still allocated*/ - if(framingCtx->pSPSContext != M4OSA_NULL) - { - // M4SPS_destroy(framingCtx->pSPSContext); - framingCtx->pSPSContext = M4OSA_NULL; - } - /*Alpha blending structure*/ - if(framingCtx->alphaBlendingStruct != M4OSA_NULL) - { - free(framingCtx->alphaBlendingStruct); - framingCtx->alphaBlendingStruct = M4OSA_NULL; - } - - free(framingCtx); - framingCtx = M4OSA_NULL; - } -#else - do - { - if(framingCtx != M4OSA_NULL) /* Bugfix 1.2.0: crash, trying to free non - existant pointer */ - { - if(framingCtx->FramingRgb != M4OSA_NULL) - { - free(framingCtx->FramingRgb->pac_data); - framingCtx->FramingRgb->pac_data = M4OSA_NULL; - free(framingCtx->FramingRgb); - framingCtx->FramingRgb = M4OSA_NULL; - } - if(framingCtx->FramingYuv != M4OSA_NULL) - { - free(framingCtx->FramingYuv[0].pac_data); - framingCtx->FramingYuv[0].pac_data = M4OSA_NULL; - free(framingCtx->FramingYuv); - framingCtx->FramingYuv = M4OSA_NULL; - } - framingCtx_save = framingCtx->pNext; - free(framingCtx); - framingCtx = M4OSA_NULL; - framingCtx = framingCtx_save; - } - else - { - /*FB: bug fix P4ME00003002*/ - break; - } - } while(framingCtx_first != framingCtx); -#endif - } - else if( M4xVSS_kVideoEffectType_Fifties == pSettings->Effects[i].VideoEffectType) - { - /* Free Fifties context */ - M4xVSS_FiftiesStruct* FiftiesCtx = pSettings->Effects[i].pExtVideoEffectFctCtxt; - - if(FiftiesCtx != M4OSA_NULL) - { - free(FiftiesCtx); - FiftiesCtx = M4OSA_NULL; - } - - } - else if( M4xVSS_kVideoEffectType_ColorRGB16 == pSettings->Effects[i].VideoEffectType - || M4xVSS_kVideoEffectType_BlackAndWhite == pSettings->Effects[i].VideoEffectType - || M4xVSS_kVideoEffectType_Pink == pSettings->Effects[i].VideoEffectType - || M4xVSS_kVideoEffectType_Green == pSettings->Effects[i].VideoEffectType - || M4xVSS_kVideoEffectType_Sepia == pSettings->Effects[i].VideoEffectType - || M4xVSS_kVideoEffectType_Negative== pSettings->Effects[i].VideoEffectType - || M4xVSS_kVideoEffectType_Gradient== pSettings->Effects[i].VideoEffectType) - { - /* Free Color context */ - M4xVSS_ColorStruct* ColorCtx = pSettings->Effects[i].pExtVideoEffectFctCtxt; - - if(ColorCtx != M4OSA_NULL) - { - free(ColorCtx); - ColorCtx = M4OSA_NULL; - } - } - - /* Free simple fields */ - if(pSettings->Effects[i].xVSS.pFramingFilePath != M4OSA_NULL) - { - free(pSettings->Effects[i].xVSS.pFramingFilePath); - pSettings->Effects[i].xVSS.pFramingFilePath = M4OSA_NULL; - } - if(pSettings->Effects[i].xVSS.pFramingBuffer != M4OSA_NULL) - { - free(pSettings->Effects[i].xVSS.pFramingBuffer); - pSettings->Effects[i].xVSS.pFramingBuffer = M4OSA_NULL; - } - if(pSettings->Effects[i].xVSS.pTextBuffer != M4OSA_NULL) - { - free(pSettings->Effects[i].xVSS.pTextBuffer); - pSettings->Effects[i].xVSS.pTextBuffer = M4OSA_NULL; - } - } - free(pSettings->Effects); - pSettings->Effects = M4OSA_NULL; - } - - return M4NO_ERROR; -} - -M4OSA_ERR M4xVSS_freeCommand(M4OSA_Context pContext) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; -// M4OSA_UInt8 i,j; - - /* Free "local" BGM settings */ - if(xVSS_context->pSettings->xVSS.pBGMtrack != M4OSA_NULL) - { - if(xVSS_context->pSettings->xVSS.pBGMtrack->pFile != M4OSA_NULL) - { - free(xVSS_context->pSettings->xVSS.pBGMtrack->pFile); - xVSS_context->pSettings->xVSS.pBGMtrack->pFile = M4OSA_NULL; - } - free(xVSS_context->pSettings->xVSS.pBGMtrack); - xVSS_context->pSettings->xVSS.pBGMtrack = M4OSA_NULL; - } - - M4xVSS_freeSettings(xVSS_context->pSettings); - - if(xVSS_context->pPTo3GPPparamsList != M4OSA_NULL) - { - M4xVSS_Pto3GPP_params* pParams = xVSS_context->pPTo3GPPparamsList; - M4xVSS_Pto3GPP_params* pParams_sauv; - - while(pParams != M4OSA_NULL) - { - if(pParams->pFileIn != M4OSA_NULL) - { - free(pParams->pFileIn); - pParams->pFileIn = M4OSA_NULL; - } - if(pParams->pFileOut != M4OSA_NULL) - { - /* Delete temporary file */ - remove((const char *)pParams->pFileOut); - free(pParams->pFileOut); - pParams->pFileOut = M4OSA_NULL; - } - if(pParams->pFileTemp != M4OSA_NULL) - { - /* Delete temporary file */ -#ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE - remove((const char *)pParams->pFileTemp); - free(pParams->pFileTemp); -#endif/*M4xVSS_RESERVED_MOOV_DISK_SPACE*/ - pParams->pFileTemp = M4OSA_NULL; - } - pParams_sauv = pParams; - pParams = pParams->pNext; - free(pParams_sauv); - pParams_sauv = M4OSA_NULL; - } - } - - if(xVSS_context->pMCSparamsList != M4OSA_NULL) - { - M4xVSS_MCS_params* pParams = xVSS_context->pMCSparamsList; - M4xVSS_MCS_params* pParams_sauv; - - while(pParams != M4OSA_NULL) - { - if(pParams->pFileIn != M4OSA_NULL) - { - free(pParams->pFileIn); - pParams->pFileIn = M4OSA_NULL; - } - if(pParams->pFileOut != M4OSA_NULL) - { - /* Delete temporary file */ - remove((const char *)pParams->pFileOut); - free(pParams->pFileOut); - pParams->pFileOut = M4OSA_NULL; - } - if(pParams->pFileTemp != M4OSA_NULL) - { - /* Delete temporary file */ -#ifdef M4xVSS_RESERVED_MOOV_DISK_SPACE - remove((const char *)pParams->pFileTemp); - free(pParams->pFileTemp); -#endif/*M4xVSS_RESERVED_MOOV_DISK_SPACE*/ - pParams->pFileTemp = M4OSA_NULL; - } - pParams_sauv = pParams; - pParams = pParams->pNext; - free(pParams_sauv); - pParams_sauv = M4OSA_NULL; - } - } - - if(xVSS_context->pcmPreviewFile != M4OSA_NULL) - { - free(xVSS_context->pcmPreviewFile); - xVSS_context->pcmPreviewFile = M4OSA_NULL; - } - if(xVSS_context->pSettings->pOutputFile != M4OSA_NULL - && xVSS_context->pOutputFile != M4OSA_NULL) - { - free(xVSS_context->pSettings->pOutputFile); - xVSS_context->pSettings->pOutputFile = M4OSA_NULL; - xVSS_context->pOutputFile = M4OSA_NULL; - } - - /* Reinit all context variables */ - xVSS_context->previousClipNumber = 0; - xVSS_context->editingStep = M4xVSS_kMicroStateEditing; - xVSS_context->analyseStep = M4xVSS_kMicroStateAnalysePto3GPP; - xVSS_context->pPTo3GPPparamsList = M4OSA_NULL; - xVSS_context->pPTo3GPPcurrentParams = M4OSA_NULL; - xVSS_context->pMCSparamsList = M4OSA_NULL; - xVSS_context->pMCScurrentParams = M4OSA_NULL; - xVSS_context->tempFileIndex = 0; - xVSS_context->targetedTimescale = 0; - - return M4NO_ERROR; -} - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalGetProperties(M4OSA_Context pContext, - * M4OSA_Char* pFile, - * M4VIDEOEDITING_ClipProperties *pFileProperties) - * - * @brief This function retrieve properties of an input 3GP file using MCS - * @note - * @param pContext (IN) The integrator own context - * @param pFile (IN) 3GP file to analyse - * @param pFileProperties (IN/OUT) Pointer on a structure that will contain - * the 3GP file properties - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalGetProperties(M4OSA_Context pContext, M4OSA_Char* pFile, - M4VIDEOEDITING_ClipProperties *pFileProperties) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4OSA_ERR err; - M4MCS_Context mcs_context; - - err = M4MCS_init(&mcs_context, xVSS_context->pFileReadPtr, xVSS_context->pFileWritePtr); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalGetProperties: Error in M4MCS_init: 0x%x", err); - return err; - } - - /*open the MCS in the "normal opening" mode to retrieve the exact duration*/ - err = M4MCS_open_normalMode(mcs_context, pFile, M4VIDEOEDITING_kFileType_3GPP, - M4OSA_NULL, M4OSA_NULL); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalGetProperties: Error in M4MCS_open: 0x%x", err); - M4MCS_abort(mcs_context); - return err; - } - - err = M4MCS_getInputFileProperties(mcs_context, pFileProperties); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("Error in M4MCS_getInputFileProperties: 0x%x", err); - M4MCS_abort(mcs_context); - return err; - } - - err = M4MCS_abort(mcs_context); - if (err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalGetProperties: Error in M4MCS_abort: 0x%x", err); - return err; - } - - return M4NO_ERROR; -} - - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalGetTargetedTimeScale(M4OSA_Context pContext, - * M4OSA_UInt32* pTargetedTimeScale) - * - * @brief This function retrieve targeted time scale - * @note - * @param pContext (IN) The integrator own context - * @param pTargetedTimeScale (OUT) Targeted time scale - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalGetTargetedTimeScale(M4OSA_Context pContext, - M4VSS3GPP_EditSettings* pSettings, - M4OSA_UInt32* pTargetedTimeScale) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4OSA_ERR err; - M4OSA_UInt32 totalDuration = 0; - M4OSA_UInt8 i = 0; - M4OSA_UInt32 tempTimeScale = 0, tempDuration = 0; - - for(i=0;i<pSettings->uiClipNumber;i++) - { - /*search timescale only in mpeg4 case*/ - if(pSettings->pClipList[i]->FileType == M4VIDEOEDITING_kFileType_3GPP - || pSettings->pClipList[i]->FileType == M4VIDEOEDITING_kFileType_MP4 - || pSettings->pClipList[i]->FileType == M4VIDEOEDITING_kFileType_M4V) - { - M4VIDEOEDITING_ClipProperties fileProperties; - - /*UTF conversion support*/ - M4OSA_Char* pDecodedPath = M4OSA_NULL; - - /** - * UTF conversion: convert into the customer format, before being used*/ - pDecodedPath = pSettings->pClipList[i]->pFile; - - if(xVSS_context->UTFConversionContext.pConvToUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer != M4OSA_NULL) - { - M4OSA_UInt32 length = 0; - err = M4xVSS_internalConvertFromUTF8(xVSS_context, - (M4OSA_Void*) pSettings->pClipList[i]->pFile, - (M4OSA_Void*) xVSS_context->UTFConversionContext.pTempOutConversionBuffer, - &length); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_Init:\ - M4xVSS_internalConvertToUTF8 returns err: 0x%x",err); - return err; - } - pDecodedPath = xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - } - - /*End of the conversion: use the decoded path*/ - err = M4xVSS_internalGetProperties(xVSS_context, pDecodedPath, &fileProperties); - - /*get input file properties*/ - /*err = M4xVSS_internalGetProperties(xVSS_context, pSettings->\ - pClipList[i]->pFile, &fileProperties);*/ - if(M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4xVSS_internalGetTargetedTimeScale:\ - M4xVSS_internalGetProperties returned: 0x%x", err); - return err; - } - if(fileProperties.VideoStreamType == M4VIDEOEDITING_kMPEG4) - { - if(pSettings->pClipList[i]->uiEndCutTime > 0) - { - if(tempDuration < (pSettings->pClipList[i]->uiEndCutTime \ - - pSettings->pClipList[i]->uiBeginCutTime)) - { - tempTimeScale = fileProperties.uiVideoTimeScale; - tempDuration = (pSettings->pClipList[i]->uiEndCutTime\ - - pSettings->pClipList[i]->uiBeginCutTime); - } - } - else - { - if(tempDuration < (fileProperties.uiClipDuration\ - - pSettings->pClipList[i]->uiBeginCutTime)) - { - tempTimeScale = fileProperties.uiVideoTimeScale; - tempDuration = (fileProperties.uiClipDuration\ - - pSettings->pClipList[i]->uiBeginCutTime); - } - } - } - } - if(pSettings->pClipList[i]->FileType == M4VIDEOEDITING_kFileType_ARGB8888) - { - /*the timescale is 30 for PTO3GP*/ - *pTargetedTimeScale = 30; - return M4NO_ERROR; - - } - } - - if(tempTimeScale >= 30)/*Define a minimum time scale, otherwise if the timescale is not - enough, there will be an infinite loop in the shell encoder*/ - { - *pTargetedTimeScale = tempTimeScale; - } - else - { - *pTargetedTimeScale = 30; - } - - return M4NO_ERROR; -} - - -/** - ****************************************************************************** - * prototype M4VSS3GPP_externalVideoEffectColor(M4OSA_Void *pFunctionContext, - * M4VIFI_ImagePlane *PlaneIn, - * M4VIFI_ImagePlane *PlaneOut, - * M4VSS3GPP_ExternalProgress *pProgress, - * M4OSA_UInt32 uiEffectKind) - * - * @brief This function apply a color effect on an input YUV420 planar frame - * @note - * @param pFunctionContext(IN) Contains which color to apply (not very clean ...) - * @param PlaneIn (IN) Input YUV420 planar - * @param PlaneOut (IN/OUT) Output YUV420 planar - * @param pProgress (IN/OUT) Progress indication (0-100) - * @param uiEffectKind (IN) Unused - * - * @return M4VIFI_OK: No error - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_externalVideoEffectColor(M4OSA_Void *pFunctionContext, - M4VIFI_ImagePlane *PlaneIn, - M4VIFI_ImagePlane *PlaneOut, - M4VSS3GPP_ExternalProgress *pProgress, - M4OSA_UInt32 uiEffectKind) -{ - M4VIFI_Int32 plane_number; - M4VIFI_UInt32 i,j; - M4VIFI_UInt8 *p_buf_src, *p_buf_dest; - M4xVSS_ColorStruct* ColorContext = (M4xVSS_ColorStruct*)pFunctionContext; - - for (plane_number = 0; plane_number < 3; plane_number++) - { - p_buf_src = &(PlaneIn[plane_number].pac_data[PlaneIn[plane_number].u_topleft]); - p_buf_dest = &(PlaneOut[plane_number].pac_data[PlaneOut[plane_number].u_topleft]); - for (i = 0; i < PlaneOut[plane_number].u_height; i++) - { - /** - * Chrominance */ - if(plane_number==1 || plane_number==2) - { - //switch ((M4OSA_UInt32)pFunctionContext) - // commented because a structure for the effects context exist - switch (ColorContext->colorEffectType) - { - case M4xVSS_kVideoEffectType_BlackAndWhite: - memset((void *)p_buf_dest,128, - PlaneIn[plane_number].u_width); - break; - case M4xVSS_kVideoEffectType_Pink: - memset((void *)p_buf_dest,255, - PlaneIn[plane_number].u_width); - break; - case M4xVSS_kVideoEffectType_Green: - memset((void *)p_buf_dest,0, - PlaneIn[plane_number].u_width); - break; - case M4xVSS_kVideoEffectType_Sepia: - if(plane_number==1) - { - memset((void *)p_buf_dest,117, - PlaneIn[plane_number].u_width); - } - else - { - memset((void *)p_buf_dest,139, - PlaneIn[plane_number].u_width); - } - break; - case M4xVSS_kVideoEffectType_Negative: - memcpy((void *)p_buf_dest, - (void *)p_buf_src ,PlaneOut[plane_number].u_width); - break; - - case M4xVSS_kVideoEffectType_ColorRGB16: - { - M4OSA_UInt16 r = 0,g = 0,b = 0,y = 0,u = 0,v = 0; - - /*first get the r, g, b*/ - b = (ColorContext->rgb16ColorData & 0x001f); - g = (ColorContext->rgb16ColorData & 0x07e0)>>5; - r = (ColorContext->rgb16ColorData & 0xf800)>>11; - - /*keep y, but replace u and v*/ - if(plane_number==1) - { - /*then convert to u*/ - u = U16(r, g, b); - memset((void *)p_buf_dest,(M4OSA_UInt8)u, - PlaneIn[plane_number].u_width); - } - if(plane_number==2) - { - /*then convert to v*/ - v = V16(r, g, b); - memset((void *)p_buf_dest, (M4OSA_UInt8)v, - PlaneIn[plane_number].u_width); - } - } - break; - case M4xVSS_kVideoEffectType_Gradient: - { - M4OSA_UInt16 r = 0,g = 0,b = 0,y = 0,u = 0,v = 0; - - /*first get the r, g, b*/ - b = (ColorContext->rgb16ColorData & 0x001f); - g = (ColorContext->rgb16ColorData & 0x07e0)>>5; - r = (ColorContext->rgb16ColorData & 0xf800)>>11; - - /*for color gradation*/ - b = (M4OSA_UInt16)( b - ((b*i)/PlaneIn[plane_number].u_height)); - g = (M4OSA_UInt16)(g - ((g*i)/PlaneIn[plane_number].u_height)); - r = (M4OSA_UInt16)(r - ((r*i)/PlaneIn[plane_number].u_height)); - - /*keep y, but replace u and v*/ - if(plane_number==1) - { - /*then convert to u*/ - u = U16(r, g, b); - memset((void *)p_buf_dest,(M4OSA_UInt8)u, - PlaneIn[plane_number].u_width); - } - if(plane_number==2) - { - /*then convert to v*/ - v = V16(r, g, b); - memset((void *)p_buf_dest,(M4OSA_UInt8)v, - PlaneIn[plane_number].u_width); - } - } - break; - default: - break; - } - } - /** - * Luminance */ - else - { - //switch ((M4OSA_UInt32)pFunctionContext) - // commented because a structure for the effects context exist - switch (ColorContext->colorEffectType) - { - case M4xVSS_kVideoEffectType_Negative: - for(j=0;j<PlaneOut[plane_number].u_width;j++) - { - p_buf_dest[j] = 255 - p_buf_src[j]; - } - break; - default: - memcpy((void *)p_buf_dest, - (void *)p_buf_src ,PlaneOut[plane_number].u_width); - break; - } - } - p_buf_src += PlaneIn[plane_number].u_stride; - p_buf_dest += PlaneOut[plane_number].u_stride; - } - } - - return M4VIFI_OK; -} - -/** - ****************************************************************************** - * prototype M4VSS3GPP_externalVideoEffectFraming(M4OSA_Void *pFunctionContext, - * M4VIFI_ImagePlane *PlaneIn, - * M4VIFI_ImagePlane *PlaneOut, - * M4VSS3GPP_ExternalProgress *pProgress, - * M4OSA_UInt32 uiEffectKind) - * - * @brief This function add a fixed or animated image on an input YUV420 planar frame - * @note - * @param pFunctionContext(IN) Contains which color to apply (not very clean ...) - * @param PlaneIn (IN) Input YUV420 planar - * @param PlaneOut (IN/OUT) Output YUV420 planar - * @param pProgress (IN/OUT) Progress indication (0-100) - * @param uiEffectKind (IN) Unused - * - * @return M4VIFI_OK: No error - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_externalVideoEffectFraming( M4OSA_Void *userData, - M4VIFI_ImagePlane PlaneIn[3], - M4VIFI_ImagePlane *PlaneOut, - M4VSS3GPP_ExternalProgress *pProgress, - M4OSA_UInt32 uiEffectKind ) -{ - M4VIFI_UInt32 x,y; - - M4VIFI_UInt8 *p_in_Y = PlaneIn[0].pac_data; - M4VIFI_UInt8 *p_in_U = PlaneIn[1].pac_data; - M4VIFI_UInt8 *p_in_V = PlaneIn[2].pac_data; - - M4xVSS_FramingStruct* Framing = M4OSA_NULL; - M4xVSS_FramingStruct* currentFraming = M4OSA_NULL; - M4VIFI_UInt8 *FramingRGB = M4OSA_NULL; - - M4VIFI_UInt8 *p_out0; - M4VIFI_UInt8 *p_out1; - M4VIFI_UInt8 *p_out2; - - M4VIFI_UInt32 topleft[2]; - - M4OSA_UInt8 transparent1 = (M4OSA_UInt8)((TRANSPARENT_COLOR & 0xFF00)>>8); - M4OSA_UInt8 transparent2 = (M4OSA_UInt8)TRANSPARENT_COLOR; - -#ifndef DECODE_GIF_ON_SAVING - Framing = (M4xVSS_FramingStruct *)userData; - currentFraming = (M4xVSS_FramingStruct *)Framing->pCurrent; - FramingRGB = Framing->FramingRgb->pac_data; -#endif /*DECODE_GIF_ON_SAVING*/ - - /*FB*/ -#ifdef DECODE_GIF_ON_SAVING - M4OSA_ERR err; - Framing = (M4xVSS_FramingStruct *)((M4xVSS_FramingContext*)userData)->aFramingCtx; - currentFraming = (M4xVSS_FramingStruct *)Framing; - FramingRGB = Framing->FramingRgb->pac_data; -#endif /*DECODE_GIF_ON_SAVING*/ - /*end FB*/ - - /** - * Initialize input / output plane pointers */ - p_in_Y += PlaneIn[0].u_topleft; - p_in_U += PlaneIn[1].u_topleft; - p_in_V += PlaneIn[2].u_topleft; - - p_out0 = PlaneOut[0].pac_data; - p_out1 = PlaneOut[1].pac_data; - p_out2 = PlaneOut[2].pac_data; - - /** - * Depending on time, initialize Framing frame to use */ - if(Framing->previousClipTime == -1) - { - Framing->previousClipTime = pProgress->uiOutputTime; - } - - /** - * If the current clip time has reach the duration of one frame of the framing picture - * we need to step to next framing picture */ - - Framing->previousClipTime = pProgress->uiOutputTime; - FramingRGB = currentFraming->FramingRgb->pac_data; - topleft[0] = currentFraming->topleft_x; - topleft[1] = currentFraming->topleft_y; - - for( x=0 ;x < PlaneIn[0].u_height ; x++) - { - for( y=0 ;y < PlaneIn[0].u_width ; y++) - { - /** - * To handle framing with input size != output size - * Framing is applyed if coordinates matches between framing/topleft and input plane */ - if( y < (topleft[0] + currentFraming->FramingYuv[0].u_width) && - y >= topleft[0] && - x < (topleft[1] + currentFraming->FramingYuv[0].u_height) && - x >= topleft[1]) - { - /*Alpha blending support*/ - M4OSA_Float alphaBlending = 1; - M4xVSS_internalEffectsAlphaBlending* alphaBlendingStruct =\ - (M4xVSS_internalEffectsAlphaBlending*)\ - ((M4xVSS_FramingContext*)userData)->alphaBlendingStruct; - - if(alphaBlendingStruct != M4OSA_NULL) - { - if(pProgress->uiProgress \ - < (M4OSA_UInt32)(alphaBlendingStruct->m_fadeInTime*10)) - { - if(alphaBlendingStruct->m_fadeInTime == 0) { - alphaBlending = alphaBlendingStruct->m_start / 100; - } else { - alphaBlending = ((M4OSA_Float)(alphaBlendingStruct->m_middle\ - - alphaBlendingStruct->m_start)\ - *pProgress->uiProgress/(alphaBlendingStruct->m_fadeInTime*10)); - alphaBlending += alphaBlendingStruct->m_start; - alphaBlending /= 100; - } - } - else if(pProgress->uiProgress >= (M4OSA_UInt32)(alphaBlendingStruct->\ - m_fadeInTime*10) && pProgress->uiProgress < 1000\ - - (M4OSA_UInt32)(alphaBlendingStruct->m_fadeOutTime*10)) - { - alphaBlending = (M4OSA_Float)\ - ((M4OSA_Float)alphaBlendingStruct->m_middle/100); - } - else if(pProgress->uiProgress >= 1000 - (M4OSA_UInt32)\ - (alphaBlendingStruct->m_fadeOutTime*10)) - { - if(alphaBlendingStruct->m_fadeOutTime == 0) { - alphaBlending = alphaBlendingStruct->m_end / 100; - } else { - alphaBlending = ((M4OSA_Float)(alphaBlendingStruct->m_middle \ - - alphaBlendingStruct->m_end))*(1000 - pProgress->uiProgress)\ - /(alphaBlendingStruct->m_fadeOutTime*10); - alphaBlending += alphaBlendingStruct->m_end; - alphaBlending /= 100; - } - } - } - /**/ - - if((*(FramingRGB)==transparent1) && (*(FramingRGB+1)==transparent2)) - { - *( p_out0+y+x*PlaneOut[0].u_stride)=(*(p_in_Y+y+x*PlaneIn[0].u_stride)); - *( p_out1+(y>>1)+(x>>1)*PlaneOut[1].u_stride)= - (*(p_in_U+(y>>1)+(x>>1)*PlaneIn[1].u_stride)); - *( p_out2+(y>>1)+(x>>1)*PlaneOut[2].u_stride)= - (*(p_in_V+(y>>1)+(x>>1)*PlaneIn[2].u_stride)); - } - else - { - *( p_out0+y+x*PlaneOut[0].u_stride)= - (*(currentFraming->FramingYuv[0].pac_data+(y-topleft[0])\ - +(x-topleft[1])*currentFraming->FramingYuv[0].u_stride))*alphaBlending; - *( p_out0+y+x*PlaneOut[0].u_stride)+= - (*(p_in_Y+y+x*PlaneIn[0].u_stride))*(1-alphaBlending); - *( p_out1+(y>>1)+(x>>1)*PlaneOut[1].u_stride)= - (*(currentFraming->FramingYuv[1].pac_data+((y-topleft[0])>>1)\ - +((x-topleft[1])>>1)*currentFraming->FramingYuv[1].u_stride))\ - *alphaBlending; - *( p_out1+(y>>1)+(x>>1)*PlaneOut[1].u_stride)+= - (*(p_in_U+(y>>1)+(x>>1)*PlaneIn[1].u_stride))*(1-alphaBlending); - *( p_out2+(y>>1)+(x>>1)*PlaneOut[2].u_stride)= - (*(currentFraming->FramingYuv[2].pac_data+((y-topleft[0])>>1)\ - +((x-topleft[1])>>1)*currentFraming->FramingYuv[2].u_stride))\ - *alphaBlending; - *( p_out2+(y>>1)+(x>>1)*PlaneOut[2].u_stride)+= - (*(p_in_V+(y>>1)+(x>>1)*PlaneIn[2].u_stride))*(1-alphaBlending); - } - if( PlaneIn[0].u_width < (topleft[0] + currentFraming->FramingYuv[0].u_width) && - y == PlaneIn[0].u_width-1) - { - FramingRGB = FramingRGB + 2 \ - * (topleft[0] + currentFraming->FramingYuv[0].u_width \ - - PlaneIn[0].u_width + 1); - } - else - { - FramingRGB = FramingRGB + 2; - } - } - /** - * Just copy input plane to output plane */ - else - { - *( p_out0+y+x*PlaneOut[0].u_stride)=*(p_in_Y+y+x*PlaneIn[0].u_stride); - *( p_out1+(y>>1)+(x>>1)*PlaneOut[1].u_stride)= - *(p_in_U+(y>>1)+(x>>1)*PlaneIn[1].u_stride); - *( p_out2+(y>>1)+(x>>1)*PlaneOut[2].u_stride)= - *(p_in_V+(y>>1)+(x>>1)*PlaneIn[2].u_stride); - } - } - } - - - return M4VIFI_OK; -} - - -/** - ****************************************************************************** - * prototype M4VSS3GPP_externalVideoEffectFifties(M4OSA_Void *pFunctionContext, - * M4VIFI_ImagePlane *PlaneIn, - * M4VIFI_ImagePlane *PlaneOut, - * M4VSS3GPP_ExternalProgress *pProgress, - * M4OSA_UInt32 uiEffectKind) - * - * @brief This function make a video look as if it was taken in the fifties - * @note - * @param pUserData (IN) Context - * @param pPlaneIn (IN) Input YUV420 planar - * @param pPlaneOut (IN/OUT) Output YUV420 planar - * @param pProgress (IN/OUT) Progress indication (0-100) - * @param uiEffectKind (IN) Unused - * - * @return M4VIFI_OK: No error - * @return M4ERR_PARAMETER: pFiftiesData, pPlaneOut or pProgress are NULL (DEBUG only) - ****************************************************************************** - */ -M4OSA_ERR M4VSS3GPP_externalVideoEffectFifties( M4OSA_Void *pUserData, - M4VIFI_ImagePlane *pPlaneIn, - M4VIFI_ImagePlane *pPlaneOut, - M4VSS3GPP_ExternalProgress *pProgress, - M4OSA_UInt32 uiEffectKind ) -{ - M4VIFI_UInt32 x, y, xShift; - M4VIFI_UInt8 *pInY = pPlaneIn[0].pac_data; - M4VIFI_UInt8 *pOutY, *pInYbegin; - M4VIFI_UInt8 *pInCr,* pOutCr; - M4VIFI_Int32 plane_number; - - /* Internal context*/ - M4xVSS_FiftiesStruct* p_FiftiesData = (M4xVSS_FiftiesStruct *)pUserData; - - /* Check the inputs (debug only) */ - M4OSA_DEBUG_IF2((p_FiftiesData == M4OSA_NULL),M4ERR_PARAMETER, - "xVSS: p_FiftiesData is M4OSA_NULL in M4VSS3GPP_externalVideoEffectFifties"); - M4OSA_DEBUG_IF2((pPlaneOut == M4OSA_NULL),M4ERR_PARAMETER, - "xVSS: p_PlaneOut is M4OSA_NULL in M4VSS3GPP_externalVideoEffectFifties"); - M4OSA_DEBUG_IF2((pProgress == M4OSA_NULL),M4ERR_PARAMETER, - "xVSS: p_Progress is M4OSA_NULL in M4VSS3GPP_externalVideoEffectFifties"); - - /* Initialize input / output plane pointers */ - pInY += pPlaneIn[0].u_topleft; - pOutY = pPlaneOut[0].pac_data; - pInYbegin = pInY; - - /* Initialize the random */ - if(p_FiftiesData->previousClipTime < 0) - { - M4OSA_randInit(); - M4OSA_rand((M4OSA_Int32 *)&(p_FiftiesData->shiftRandomValue), (pPlaneIn[0].u_height) >> 4); - M4OSA_rand((M4OSA_Int32 *)&(p_FiftiesData->stripeRandomValue), (pPlaneIn[0].u_width)<< 2); - p_FiftiesData->previousClipTime = pProgress->uiOutputTime; - } - - /* Choose random values if we have reached the duration of a partial effect */ - else if( (pProgress->uiOutputTime - p_FiftiesData->previousClipTime)\ - > p_FiftiesData->fiftiesEffectDuration) - { - M4OSA_rand((M4OSA_Int32 *)&(p_FiftiesData->shiftRandomValue), (pPlaneIn[0].u_height) >> 4); - M4OSA_rand((M4OSA_Int32 *)&(p_FiftiesData->stripeRandomValue), (pPlaneIn[0].u_width)<< 2); - p_FiftiesData->previousClipTime = pProgress->uiOutputTime; - } - - /* Put in Sepia the chrominance */ - for (plane_number = 1; plane_number < 3; plane_number++) - { - pInCr = pPlaneIn[plane_number].pac_data + pPlaneIn[plane_number].u_topleft; - pOutCr = pPlaneOut[plane_number].pac_data + pPlaneOut[plane_number].u_topleft; - - for (x = 0; x < pPlaneOut[plane_number].u_height; x++) - { - if (1 == plane_number) - memset((void *)pOutCr, 117,pPlaneIn[plane_number].u_width); /* U value */ - else - memset((void *)pOutCr, 139,pPlaneIn[plane_number].u_width); /* V value */ - - pInCr += pPlaneIn[plane_number].u_stride; - pOutCr += pPlaneOut[plane_number].u_stride; - } - } - - /* Compute the new pixels values */ - for( x = 0 ; x < pPlaneIn[0].u_height ; x++) - { - M4VIFI_UInt8 *p_outYtmp, *p_inYtmp; - - /* Compute the xShift (random value) */ - if (0 == (p_FiftiesData->shiftRandomValue % 5 )) - xShift = (x + p_FiftiesData->shiftRandomValue ) % (pPlaneIn[0].u_height - 1); - else - xShift = (x + (pPlaneIn[0].u_height - p_FiftiesData->shiftRandomValue) ) \ - % (pPlaneIn[0].u_height - 1); - - /* Initialize the pointers */ - p_outYtmp = pOutY + 1; /* yShift of 1 pixel */ - p_inYtmp = pInYbegin + (xShift * pPlaneIn[0].u_stride); /* Apply the xShift */ - - for( y = 0 ; y < pPlaneIn[0].u_width ; y++) - { - /* Set Y value */ - if (xShift > (pPlaneIn[0].u_height - 4)) - *p_outYtmp = 40; /* Add some horizontal black lines between the - two parts of the image */ - else if ( y == p_FiftiesData->stripeRandomValue) - *p_outYtmp = 90; /* Add a random vertical line for the bulk */ - else - *p_outYtmp = *p_inYtmp; - - - /* Go to the next pixel */ - p_outYtmp++; - p_inYtmp++; - - /* Restart at the beginning of the line for the last pixel*/ - if (y == (pPlaneIn[0].u_width - 2)) - p_outYtmp = pOutY; - } - - /* Go to the next line */ - pOutY += pPlaneOut[0].u_stride; - } - - return M4VIFI_OK; -} - -/** - ****************************************************************************** - * M4OSA_ERR M4VSS3GPP_externalVideoEffectZoom( ) - * @brief Zoom in/out video effect functions. - * @note The external video function is used only if VideoEffectType is set to - * M4VSS3GPP_kVideoEffectType_ZoomIn or M4VSS3GPP_kVideoEffectType_ZoomOut. - * - * @param pFunctionContext (IN) The function context, previously set by the integrator - * @param pInputPlanes (IN) Input YUV420 image: pointer to an array of three valid - * image planes (Y, U and V) - * @param pOutputPlanes (IN/OUT) Output (filtered) YUV420 image: pointer to an array of - * three valid image planes (Y, U and V) - * @param pProgress (IN) Set of information about the video transition progress. - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one parameter is M4OSA_NULL (debug only) - ****************************************************************************** - */ - -M4OSA_ERR M4VSS3GPP_externalVideoEffectZoom( - M4OSA_Void *pFunctionContext, - M4VIFI_ImagePlane *pInputPlanes, - M4VIFI_ImagePlane *pOutputPlanes, - M4VSS3GPP_ExternalProgress *pProgress, - M4OSA_UInt32 uiEffectKind -) -{ - M4OSA_UInt32 boxWidth; - M4OSA_UInt32 boxHeight; - M4OSA_UInt32 boxPosX; - M4OSA_UInt32 boxPosY; - M4OSA_UInt32 ratio = 0; - /* * 1.189207 between ratio */ - /* zoom between x1 and x16 */ - M4OSA_UInt32 ratiotab[17] ={1024,1218,1448,1722,2048,2435,2896,3444,4096,4871,5793,\ - 6889,8192,9742,11585,13777,16384}; - M4OSA_UInt32 ik; - - M4VIFI_ImagePlane boxPlane[3]; - - if((M4OSA_Void *)M4xVSS_kVideoEffectType_ZoomOut == pFunctionContext) - { - //ratio = 16 - (15 * pProgress->uiProgress)/1000; - ratio = 16 - pProgress->uiProgress / 66 ; - } - else if((M4OSA_Void *)M4xVSS_kVideoEffectType_ZoomIn == pFunctionContext) - { - //ratio = 1 + (15 * pProgress->uiProgress)/1000; - ratio = 1 + pProgress->uiProgress / 66 ; - } - - for(ik=0;ik<3;ik++){ - - boxPlane[ik].u_stride = pInputPlanes[ik].u_stride; - boxPlane[ik].pac_data = pInputPlanes[ik].pac_data; - - boxHeight = ( pInputPlanes[ik].u_height << 10 ) / ratiotab[ratio]; - boxWidth = ( pInputPlanes[ik].u_width << 10 ) / ratiotab[ratio]; - boxPlane[ik].u_height = (boxHeight)&(~1); - boxPlane[ik].u_width = (boxWidth)&(~1); - - boxPosY = (pInputPlanes[ik].u_height >> 1) - (boxPlane[ik].u_height >> 1); - boxPosX = (pInputPlanes[ik].u_width >> 1) - (boxPlane[ik].u_width >> 1); - boxPlane[ik].u_topleft = boxPosY * boxPlane[ik].u_stride + boxPosX; - } - - M4VIFI_ResizeBilinearYUV420toYUV420(M4OSA_NULL, (M4VIFI_ImagePlane*)&boxPlane, pOutputPlanes); - - /** - * Return */ - return(M4NO_ERROR); -} - -/** - ****************************************************************************** - * prototype M4xVSS_AlphaMagic( M4OSA_Void *userData, - * M4VIFI_ImagePlane PlaneIn1[3], - * M4VIFI_ImagePlane PlaneIn2[3], - * M4VIFI_ImagePlane *PlaneOut, - * M4VSS3GPP_ExternalProgress *pProgress, - * M4OSA_UInt32 uiTransitionKind) - * - * @brief This function apply a color effect on an input YUV420 planar frame - * @note - * @param userData (IN) Contains a pointer on a settings structure - * @param PlaneIn1 (IN) Input YUV420 planar from video 1 - * @param PlaneIn2 (IN) Input YUV420 planar from video 2 - * @param PlaneOut (IN/OUT) Output YUV420 planar - * @param pProgress (IN/OUT) Progress indication (0-100) - * @param uiTransitionKind(IN) Unused - * - * @return M4VIFI_OK: No error - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_AlphaMagic( M4OSA_Void *userData, M4VIFI_ImagePlane PlaneIn1[3], - M4VIFI_ImagePlane PlaneIn2[3], M4VIFI_ImagePlane *PlaneOut, - M4VSS3GPP_ExternalProgress *pProgress, M4OSA_UInt32 uiTransitionKind) -{ - - M4OSA_ERR err; - - M4xVSS_internal_AlphaMagicSettings* alphaContext; - M4VIFI_Int32 alphaProgressLevel; - - M4VIFI_ImagePlane* planeswap; - M4VIFI_UInt32 x,y; - - M4VIFI_UInt8 *p_out0; - M4VIFI_UInt8 *p_out1; - M4VIFI_UInt8 *p_out2; - M4VIFI_UInt8 *alphaMask; - /* "Old image" */ - M4VIFI_UInt8 *p_in1_Y; - M4VIFI_UInt8 *p_in1_U; - M4VIFI_UInt8 *p_in1_V; - /* "New image" */ - M4VIFI_UInt8 *p_in2_Y; - M4VIFI_UInt8 *p_in2_U; - M4VIFI_UInt8 *p_in2_V; - - err = M4NO_ERROR; - - alphaContext = (M4xVSS_internal_AlphaMagicSettings*)userData; - - alphaProgressLevel = (pProgress->uiProgress * 128)/1000; - - if( alphaContext->isreverse != M4OSA_FALSE) - { - alphaProgressLevel = 128 - alphaProgressLevel; - planeswap = PlaneIn1; - PlaneIn1 = PlaneIn2; - PlaneIn2 = planeswap; - } - - p_out0 = PlaneOut[0].pac_data; - p_out1 = PlaneOut[1].pac_data; - p_out2 = PlaneOut[2].pac_data; - - alphaMask = alphaContext->pPlane->pac_data; - - /* "Old image" */ - p_in1_Y = PlaneIn1[0].pac_data; - p_in1_U = PlaneIn1[1].pac_data; - p_in1_V = PlaneIn1[2].pac_data; - /* "New image" */ - p_in2_Y = PlaneIn2[0].pac_data; - p_in2_U = PlaneIn2[1].pac_data; - p_in2_V = PlaneIn2[2].pac_data; - - /** - * For each column ... */ - for( y=0; y<PlaneOut->u_height; y++ ) - { - /** - * ... and each row of the alpha mask */ - for( x=0; x<PlaneOut->u_width; x++ ) - { - /** - * If the value of the current pixel of the alpha mask is > to the current time - * ( current time is normalized on [0-255] ) */ - if( alphaProgressLevel < alphaMask[x+y*PlaneOut->u_width] ) - { - /* We keep "old image" in output plane */ - *( p_out0+x+y*PlaneOut[0].u_stride)=*(p_in1_Y+x+y*PlaneIn1[0].u_stride); - *( p_out1+(x>>1)+(y>>1)*PlaneOut[1].u_stride)= - *(p_in1_U+(x>>1)+(y>>1)*PlaneIn1[1].u_stride); - *( p_out2+(x>>1)+(y>>1)*PlaneOut[2].u_stride)= - *(p_in1_V+(x>>1)+(y>>1)*PlaneIn1[2].u_stride); - } - else - { - /* We take "new image" in output plane */ - *( p_out0+x+y*PlaneOut[0].u_stride)=*(p_in2_Y+x+y*PlaneIn2[0].u_stride); - *( p_out1+(x>>1)+(y>>1)*PlaneOut[1].u_stride)= - *(p_in2_U+(x>>1)+(y>>1)*PlaneIn2[1].u_stride); - *( p_out2+(x>>1)+(y>>1)*PlaneOut[2].u_stride)= - *(p_in2_V+(x>>1)+(y>>1)*PlaneIn2[2].u_stride); - } - } - } - - return(err); -} - -/** - ****************************************************************************** - * prototype M4xVSS_AlphaMagicBlending( M4OSA_Void *userData, - * M4VIFI_ImagePlane PlaneIn1[3], - * M4VIFI_ImagePlane PlaneIn2[3], - * M4VIFI_ImagePlane *PlaneOut, - * M4VSS3GPP_ExternalProgress *pProgress, - * M4OSA_UInt32 uiTransitionKind) - * - * @brief This function apply a color effect on an input YUV420 planar frame - * @note - * @param userData (IN) Contains a pointer on a settings structure - * @param PlaneIn1 (IN) Input YUV420 planar from video 1 - * @param PlaneIn2 (IN) Input YUV420 planar from video 2 - * @param PlaneOut (IN/OUT) Output YUV420 planar - * @param pProgress (IN/OUT) Progress indication (0-100) - * @param uiTransitionKind(IN) Unused - * - * @return M4VIFI_OK: No error - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_AlphaMagicBlending( M4OSA_Void *userData, M4VIFI_ImagePlane PlaneIn1[3], - M4VIFI_ImagePlane PlaneIn2[3], M4VIFI_ImagePlane *PlaneOut, - M4VSS3GPP_ExternalProgress *pProgress, - M4OSA_UInt32 uiTransitionKind) -{ - M4OSA_ERR err; - - M4xVSS_internal_AlphaMagicSettings* alphaContext; - M4VIFI_Int32 alphaProgressLevel; - M4VIFI_Int32 alphaBlendLevelMin; - M4VIFI_Int32 alphaBlendLevelMax; - M4VIFI_Int32 alphaBlendRange; - - M4VIFI_ImagePlane* planeswap; - M4VIFI_UInt32 x,y; - M4VIFI_Int32 alphaMaskValue; - - M4VIFI_UInt8 *p_out0; - M4VIFI_UInt8 *p_out1; - M4VIFI_UInt8 *p_out2; - M4VIFI_UInt8 *alphaMask; - /* "Old image" */ - M4VIFI_UInt8 *p_in1_Y; - M4VIFI_UInt8 *p_in1_U; - M4VIFI_UInt8 *p_in1_V; - /* "New image" */ - M4VIFI_UInt8 *p_in2_Y; - M4VIFI_UInt8 *p_in2_U; - M4VIFI_UInt8 *p_in2_V; - - - err = M4NO_ERROR; - - alphaContext = (M4xVSS_internal_AlphaMagicSettings*)userData; - - alphaProgressLevel = (pProgress->uiProgress * 128)/1000; - - if( alphaContext->isreverse != M4OSA_FALSE) - { - alphaProgressLevel = 128 - alphaProgressLevel; - planeswap = PlaneIn1; - PlaneIn1 = PlaneIn2; - PlaneIn2 = planeswap; - } - - alphaBlendLevelMin = alphaProgressLevel-alphaContext->blendingthreshold; - - alphaBlendLevelMax = alphaProgressLevel+alphaContext->blendingthreshold; - - alphaBlendRange = (alphaContext->blendingthreshold)*2; - - p_out0 = PlaneOut[0].pac_data; - p_out1 = PlaneOut[1].pac_data; - p_out2 = PlaneOut[2].pac_data; - - alphaMask = alphaContext->pPlane->pac_data; - - /* "Old image" */ - p_in1_Y = PlaneIn1[0].pac_data; - p_in1_U = PlaneIn1[1].pac_data; - p_in1_V = PlaneIn1[2].pac_data; - /* "New image" */ - p_in2_Y = PlaneIn2[0].pac_data; - p_in2_U = PlaneIn2[1].pac_data; - p_in2_V = PlaneIn2[2].pac_data; - - /* apply Alpha Magic on each pixel */ - for( y=0; y<PlaneOut->u_height; y++ ) - { - for( x=0; x<PlaneOut->u_width; x++ ) - { - alphaMaskValue = alphaMask[x+y*PlaneOut->u_width]; - if( alphaBlendLevelMax < alphaMaskValue ) - { - /* We keep "old image" in output plane */ - *( p_out0+x+y*PlaneOut[0].u_stride)=*(p_in1_Y+x+y*PlaneIn1[0].u_stride); - *( p_out1+(x>>1)+(y>>1)*PlaneOut[1].u_stride)= - *(p_in1_U+(x>>1)+(y>>1)*PlaneIn1[1].u_stride); - *( p_out2+(x>>1)+(y>>1)*PlaneOut[2].u_stride)= - *(p_in1_V+(x>>1)+(y>>1)*PlaneIn1[2].u_stride); - } - else if( (alphaBlendLevelMin < alphaMaskValue)&& - (alphaMaskValue <= alphaBlendLevelMax ) ) - { - /* We blend "old and new image" in output plane */ - *( p_out0+x+y*PlaneOut[0].u_stride)=(M4VIFI_UInt8) - (( (alphaMaskValue-alphaBlendLevelMin)*( *(p_in1_Y+x+y*PlaneIn1[0].u_stride)) - +(alphaBlendLevelMax-alphaMaskValue)\ - *( *(p_in2_Y+x+y*PlaneIn2[0].u_stride)) )/alphaBlendRange ); - - *( p_out1+(x>>1)+(y>>1)*PlaneOut[1].u_stride)=(M4VIFI_UInt8)\ - (( (alphaMaskValue-alphaBlendLevelMin)*( *(p_in1_U+(x>>1)+(y>>1)\ - *PlaneIn1[1].u_stride)) - +(alphaBlendLevelMax-alphaMaskValue)*( *(p_in2_U+(x>>1)+(y>>1)\ - *PlaneIn2[1].u_stride)) )/alphaBlendRange ); - - *( p_out2+(x>>1)+(y>>1)*PlaneOut[2].u_stride)= - (M4VIFI_UInt8)(( (alphaMaskValue-alphaBlendLevelMin)\ - *( *(p_in1_V+(x>>1)+(y>>1)*PlaneIn1[2].u_stride)) - +(alphaBlendLevelMax-alphaMaskValue)*( *(p_in2_V+(x>>1)+(y>>1)\ - *PlaneIn2[2].u_stride)) )/alphaBlendRange ); - - } - else - { - /* We take "new image" in output plane */ - *( p_out0+x+y*PlaneOut[0].u_stride)=*(p_in2_Y+x+y*PlaneIn2[0].u_stride); - *( p_out1+(x>>1)+(y>>1)*PlaneOut[1].u_stride)= - *(p_in2_U+(x>>1)+(y>>1)*PlaneIn2[1].u_stride); - *( p_out2+(x>>1)+(y>>1)*PlaneOut[2].u_stride)= - *(p_in2_V+(x>>1)+(y>>1)*PlaneIn2[2].u_stride); - } - } - } - - return(err); -} - -#define M4XXX_SampleAddress(plane, x, y) ( (plane).pac_data + (plane).u_topleft + (y)\ - * (plane).u_stride + (x) ) - -static void M4XXX_CopyPlane(M4VIFI_ImagePlane* dest, M4VIFI_ImagePlane* source) -{ - M4OSA_UInt32 height, width, sourceStride, destStride, y; - M4OSA_MemAddr8 sourceWalk, destWalk; - - /* cache the vars used in the loop so as to avoid them being repeatedly fetched and - recomputed from memory. */ - height = dest->u_height; - width = dest->u_width; - - sourceWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(*source, 0, 0); - sourceStride = source->u_stride; - - destWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(*dest, 0, 0); - destStride = dest->u_stride; - - for (y=0; y<height; y++) - { - memcpy((void *)destWalk, (void *)sourceWalk, width); - destWalk += destStride; - sourceWalk += sourceStride; - } -} - -static M4OSA_ERR M4xVSS_VerticalSlideTransition(M4VIFI_ImagePlane* topPlane, - M4VIFI_ImagePlane* bottomPlane, - M4VIFI_ImagePlane *PlaneOut, - M4OSA_UInt32 shiftUV) -{ - M4OSA_UInt32 i; - - /* Do three loops, one for each plane type, in order to avoid having too many buffers - "hot" at the same time (better for cache). */ - for (i=0; i<3; i++) - { - M4OSA_UInt32 topPartHeight, bottomPartHeight, width, sourceStride, destStride, y; - M4OSA_MemAddr8 sourceWalk, destWalk; - - /* cache the vars used in the loop so as to avoid them being repeatedly fetched and - recomputed from memory. */ - if (0 == i) /* Y plane */ - { - bottomPartHeight = 2*shiftUV; - } - else /* U and V planes */ - { - bottomPartHeight = shiftUV; - } - topPartHeight = PlaneOut[i].u_height - bottomPartHeight; - width = PlaneOut[i].u_width; - - sourceWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(topPlane[i], 0, bottomPartHeight); - sourceStride = topPlane[i].u_stride; - - destWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(PlaneOut[i], 0, 0); - destStride = PlaneOut[i].u_stride; - - /* First the part from the top source clip frame. */ - for (y=0; y<topPartHeight; y++) - { - memcpy((void *)destWalk, (void *)sourceWalk, width); - destWalk += destStride; - sourceWalk += sourceStride; - } - - /* and now change the vars to copy the part from the bottom source clip frame. */ - sourceWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(bottomPlane[i], 0, 0); - sourceStride = bottomPlane[i].u_stride; - - /* destWalk is already at M4XXX_SampleAddress(PlaneOut[i], 0, topPartHeight) */ - - for (y=0; y<bottomPartHeight; y++) - { - memcpy((void *)destWalk, (void *)sourceWalk, width); - destWalk += destStride; - sourceWalk += sourceStride; - } - } - return M4NO_ERROR; -} - -static M4OSA_ERR M4xVSS_HorizontalSlideTransition(M4VIFI_ImagePlane* leftPlane, - M4VIFI_ImagePlane* rightPlane, - M4VIFI_ImagePlane *PlaneOut, - M4OSA_UInt32 shiftUV) -{ - M4OSA_UInt32 i, y; - /* If we shifted by exactly 0, or by the width of the target image, then we would get the left - frame or the right frame, respectively. These cases aren't handled too well by the general - handling, since they result in 0-size memcopies, so might as well particularize them. */ - - if (0 == shiftUV) /* output left frame */ - { - for (i = 0; i<3; i++) /* for each YUV plane */ - { - M4XXX_CopyPlane(&(PlaneOut[i]), &(leftPlane[i])); - } - - return M4NO_ERROR; - } - - if (PlaneOut[1].u_width == shiftUV) /* output right frame */ - { - for (i = 0; i<3; i++) /* for each YUV plane */ - { - M4XXX_CopyPlane(&(PlaneOut[i]), &(rightPlane[i])); - } - - return M4NO_ERROR; - } - - - /* Do three loops, one for each plane type, in order to avoid having too many buffers - "hot" at the same time (better for cache). */ - for (i=0; i<3; i++) - { - M4OSA_UInt32 height, leftPartWidth, rightPartWidth; - M4OSA_UInt32 leftStride, rightStride, destStride; - M4OSA_MemAddr8 leftWalk, rightWalk, destWalkLeft, destWalkRight; - - /* cache the vars used in the loop so as to avoid them being repeatedly fetched - and recomputed from memory. */ - height = PlaneOut[i].u_height; - - if (0 == i) /* Y plane */ - { - rightPartWidth = 2*shiftUV; - } - else /* U and V planes */ - { - rightPartWidth = shiftUV; - } - leftPartWidth = PlaneOut[i].u_width - rightPartWidth; - - leftWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(leftPlane[i], rightPartWidth, 0); - leftStride = leftPlane[i].u_stride; - - rightWalk = (M4OSA_MemAddr8)M4XXX_SampleAddress(rightPlane[i], 0, 0); - rightStride = rightPlane[i].u_stride; - - destWalkLeft = (M4OSA_MemAddr8)M4XXX_SampleAddress(PlaneOut[i], 0, 0); - destWalkRight = (M4OSA_MemAddr8)M4XXX_SampleAddress(PlaneOut[i], leftPartWidth, 0); - destStride = PlaneOut[i].u_stride; - - for (y=0; y<height; y++) - { - memcpy((void *)destWalkLeft, (void *)leftWalk, leftPartWidth); - leftWalk += leftStride; - - memcpy((void *)destWalkRight, (void *)rightWalk, rightPartWidth); - rightWalk += rightStride; - - destWalkLeft += destStride; - destWalkRight += destStride; - } - } - - return M4NO_ERROR; -} - - -M4OSA_ERR M4xVSS_SlideTransition( M4OSA_Void *userData, M4VIFI_ImagePlane PlaneIn1[3], - M4VIFI_ImagePlane PlaneIn2[3], M4VIFI_ImagePlane *PlaneOut, - M4VSS3GPP_ExternalProgress *pProgress, - M4OSA_UInt32 uiTransitionKind) -{ - M4xVSS_internal_SlideTransitionSettings* settings = - (M4xVSS_internal_SlideTransitionSettings*)userData; - M4OSA_UInt32 shiftUV; - - M4OSA_TRACE1_0("inside M4xVSS_SlideTransition"); - if ((M4xVSS_SlideTransition_RightOutLeftIn == settings->direction) - || (M4xVSS_SlideTransition_LeftOutRightIn == settings->direction) ) - { - /* horizontal slide */ - shiftUV = ((PlaneOut[1]).u_width * pProgress->uiProgress)/1000; - M4OSA_TRACE1_2("M4xVSS_SlideTransition upper: shiftUV = %d,progress = %d", - shiftUV,pProgress->uiProgress ); - if (M4xVSS_SlideTransition_RightOutLeftIn == settings->direction) - { - /* Put the previous clip frame right, the next clip frame left, and reverse shiftUV - (since it's a shift from the left frame) so that we start out on the right - (i.e. not left) frame, it - being from the previous clip. */ - return M4xVSS_HorizontalSlideTransition(PlaneIn2, PlaneIn1, PlaneOut, - (PlaneOut[1]).u_width - shiftUV); - } - else /* Left out, right in*/ - { - return M4xVSS_HorizontalSlideTransition(PlaneIn1, PlaneIn2, PlaneOut, shiftUV); - } - } - else - { - /* vertical slide */ - shiftUV = ((PlaneOut[1]).u_height * pProgress->uiProgress)/1000; - M4OSA_TRACE1_2("M4xVSS_SlideTransition bottom: shiftUV = %d,progress = %d",shiftUV, - pProgress->uiProgress ); - if (M4xVSS_SlideTransition_TopOutBottomIn == settings->direction) - { - /* Put the previous clip frame top, the next clip frame bottom. */ - return M4xVSS_VerticalSlideTransition(PlaneIn1, PlaneIn2, PlaneOut, shiftUV); - } - else /* Bottom out, top in */ - { - return M4xVSS_VerticalSlideTransition(PlaneIn2, PlaneIn1, PlaneOut, - (PlaneOut[1]).u_height - shiftUV); - } - } - - /* Note: it might be worthwhile to do some parameter checking, see if dimensions match, etc., - at least in debug mode. */ -} - - -/** - ****************************************************************************** - * prototype M4xVSS_FadeBlackTransition(M4OSA_Void *pFunctionContext, - * M4VIFI_ImagePlane *PlaneIn, - * M4VIFI_ImagePlane *PlaneOut, - * M4VSS3GPP_ExternalProgress *pProgress, - * M4OSA_UInt32 uiEffectKind) - * - * @brief This function apply a fade to black and then a fade from black - * @note - * @param pFunctionContext(IN) Contains which color to apply (not very clean ...) - * @param PlaneIn (IN) Input YUV420 planar - * @param PlaneOut (IN/OUT) Output YUV420 planar - * @param pProgress (IN/OUT) Progress indication (0-100) - * @param uiEffectKind (IN) Unused - * - * @return M4VIFI_OK: No error - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_FadeBlackTransition(M4OSA_Void *userData, M4VIFI_ImagePlane PlaneIn1[3], - M4VIFI_ImagePlane PlaneIn2[3], - M4VIFI_ImagePlane *PlaneOut, - M4VSS3GPP_ExternalProgress *pProgress, - M4OSA_UInt32 uiTransitionKind) -{ - M4OSA_Int32 tmp = 0; - M4OSA_ERR err = M4NO_ERROR; - - - if((pProgress->uiProgress) < 500) - { - /** - * Compute where we are in the effect (scale is 0->1024) */ - tmp = (M4OSA_Int32)((1.0 - ((M4OSA_Float)(pProgress->uiProgress*2)/1000)) * 1024 ); - - /** - * Apply the darkening effect */ - err = M4VFL_modifyLumaWithScale( (M4ViComImagePlane*)PlaneIn1, - (M4ViComImagePlane*)PlaneOut, tmp, M4OSA_NULL); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4xVSS_FadeBlackTransition: M4VFL_modifyLumaWithScale returns\ - error 0x%x, returning M4VSS3GPP_ERR_LUMA_FILTER_ERROR", err); - return M4VSS3GPP_ERR_LUMA_FILTER_ERROR; - } - } - else - { - /** - * Compute where we are in the effect (scale is 0->1024). */ - tmp = (M4OSA_Int32)( (((M4OSA_Float)(((pProgress->uiProgress-500)*2))/1000)) * 1024 ); - - /** - * Apply the darkening effect */ - err = M4VFL_modifyLumaWithScale((M4ViComImagePlane*)PlaneIn2, - (M4ViComImagePlane*)PlaneOut, tmp, M4OSA_NULL); - if (M4NO_ERROR != err) - { - M4OSA_TRACE1_1("M4xVSS_FadeBlackTransition:\ - M4VFL_modifyLumaWithScale returns error 0x%x,\ - returning M4VSS3GPP_ERR_LUMA_FILTER_ERROR", err); - return M4VSS3GPP_ERR_LUMA_FILTER_ERROR; - } - } - - - return M4VIFI_OK; -} - - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalConvertToUTF8(M4OSA_Context pContext, - * M4OSA_Void* pBufferIn, - * M4OSA_Void* pBufferOut, - * M4OSA_UInt32* convertedSize) - * - * @brief This function convert from the customer format to UTF8 - * @note - * @param pContext (IN) The integrator own context - * @param pBufferIn (IN) Buffer to convert - * @param pBufferOut (OUT) Converted buffer - * @param convertedSize (OUT) Size of the converted buffer - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalConvertToUTF8(M4OSA_Context pContext, M4OSA_Void* pBufferIn, - M4OSA_Void* pBufferOut, M4OSA_UInt32* convertedSize) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4OSA_ERR err; - - pBufferOut = pBufferIn; - if(xVSS_context->UTFConversionContext.pConvToUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer != M4OSA_NULL) - { - M4OSA_UInt32 ConvertedSize = xVSS_context->UTFConversionContext.m_TempOutConversionSize; - - memset((void *)xVSS_context->UTFConversionContext.pTempOutConversionBuffer,0 - ,(M4OSA_UInt32)xVSS_context->UTFConversionContext.m_TempOutConversionSize); - - err = xVSS_context->UTFConversionContext.pConvToUTF8Fct((M4OSA_Void*)pBufferIn, - (M4OSA_UInt8*)xVSS_context->UTFConversionContext.pTempOutConversionBuffer, - (M4OSA_UInt32*)&ConvertedSize); - if(err == M4xVSSWAR_BUFFER_OUT_TOO_SMALL) - { - M4OSA_TRACE2_1("M4xVSS_internalConvertToUTF8: pConvToUTF8Fct return 0x%x",err); - - /*free too small buffer*/ - free(xVSS_context->\ - UTFConversionContext.pTempOutConversionBuffer); - - /*re-allocate the buffer*/ - xVSS_context->UTFConversionContext.pTempOutConversionBuffer = - (M4OSA_Void*)M4OSA_32bitAlignedMalloc(ConvertedSize*sizeof(M4OSA_UInt8), M4VA, - (M4OSA_Char *)"M4xVSS_internalConvertToUTF8: UTF conversion buffer"); - if(M4OSA_NULL == xVSS_context->UTFConversionContext.pTempOutConversionBuffer) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertToUTF8"); - return M4ERR_ALLOC; - } - xVSS_context->UTFConversionContext.m_TempOutConversionSize = ConvertedSize; - - memset((void *)xVSS_context->\ - UTFConversionContext.pTempOutConversionBuffer,0,(M4OSA_UInt32)xVSS_context->\ - UTFConversionContext.m_TempOutConversionSize); - - err = xVSS_context->UTFConversionContext.pConvToUTF8Fct((M4OSA_Void*)pBufferIn, - (M4OSA_Void*)xVSS_context->UTFConversionContext.pTempOutConversionBuffer, - (M4OSA_UInt32*)&ConvertedSize); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalConvertToUTF8: pConvToUTF8Fct return 0x%x",err); - return err; - } - } - else if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalConvertToUTF8: pConvToUTF8Fct return 0x%x",err); - return err; - } - /*decoded path*/ - pBufferOut = xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - (*convertedSize) = ConvertedSize; - } - return M4NO_ERROR; -} - - -/** - ****************************************************************************** - * prototype M4OSA_ERR M4xVSS_internalConvertFromUTF8(M4OSA_Context pContext) - * - * @brief This function convert from UTF8 to the customer format - * @note - * @param pContext (IN) The integrator own context - * @param pBufferIn (IN) Buffer to convert - * @param pBufferOut (OUT) Converted buffer - * @param convertedSize (OUT) Size of the converted buffer - * - * @return M4NO_ERROR: No error - * @return M4ERR_PARAMETER: At least one of the function parameters is null - ****************************************************************************** - */ -M4OSA_ERR M4xVSS_internalConvertFromUTF8(M4OSA_Context pContext, M4OSA_Void* pBufferIn, - M4OSA_Void* pBufferOut, M4OSA_UInt32* convertedSize) -{ - M4xVSS_Context* xVSS_context = (M4xVSS_Context*)pContext; - M4OSA_ERR err; - - pBufferOut = pBufferIn; - if(xVSS_context->UTFConversionContext.pConvFromUTF8Fct != M4OSA_NULL - && xVSS_context->UTFConversionContext.pTempOutConversionBuffer != M4OSA_NULL) - { - M4OSA_UInt32 ConvertedSize = xVSS_context->UTFConversionContext.m_TempOutConversionSize; - - memset((void *)xVSS_context->\ - UTFConversionContext.pTempOutConversionBuffer,0,(M4OSA_UInt32)xVSS_context->\ - UTFConversionContext.m_TempOutConversionSize); - - err = xVSS_context->UTFConversionContext.pConvFromUTF8Fct\ - ((M4OSA_Void*)pBufferIn,(M4OSA_UInt8*)xVSS_context->\ - UTFConversionContext.pTempOutConversionBuffer, (M4OSA_UInt32*)&ConvertedSize); - if(err == M4xVSSWAR_BUFFER_OUT_TOO_SMALL) - { - M4OSA_TRACE2_1("M4xVSS_internalConvertFromUTF8: pConvFromUTF8Fct return 0x%x",err); - - /*free too small buffer*/ - free(xVSS_context->\ - UTFConversionContext.pTempOutConversionBuffer); - - /*re-allocate the buffer*/ - xVSS_context->UTFConversionContext.pTempOutConversionBuffer = - (M4OSA_Void*)M4OSA_32bitAlignedMalloc(ConvertedSize*sizeof(M4OSA_UInt8), M4VA, - (M4OSA_Char *)"M4xVSS_internalConvertFromUTF8: UTF conversion buffer"); - if(M4OSA_NULL == xVSS_context->UTFConversionContext.pTempOutConversionBuffer) - { - M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertFromUTF8"); - return M4ERR_ALLOC; - } - xVSS_context->UTFConversionContext.m_TempOutConversionSize = ConvertedSize; - - memset((void *)xVSS_context->\ - UTFConversionContext.pTempOutConversionBuffer,0,(M4OSA_UInt32)xVSS_context->\ - UTFConversionContext.m_TempOutConversionSize); - - err = xVSS_context->UTFConversionContext.pConvFromUTF8Fct((M4OSA_Void*)pBufferIn, - (M4OSA_Void*)xVSS_context->UTFConversionContext.pTempOutConversionBuffer, - (M4OSA_UInt32*)&ConvertedSize); - if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalConvertFromUTF8: pConvFromUTF8Fct return 0x%x",err); - return err; - } - } - else if(err != M4NO_ERROR) - { - M4OSA_TRACE1_1("M4xVSS_internalConvertFromUTF8: pConvFromUTF8Fct return 0x%x",err); - return err; - } - /*decoded path*/ - pBufferOut = xVSS_context->UTFConversionContext.pTempOutConversionBuffer; - (*convertedSize) = ConvertedSize; - } - - - return M4NO_ERROR; -} diff --git a/libvideoeditor/vss/src/MODULE_LICENSE_APACHE2 b/libvideoeditor/vss/src/MODULE_LICENSE_APACHE2 deleted file mode 100644 index e69de29..0000000 --- a/libvideoeditor/vss/src/MODULE_LICENSE_APACHE2 +++ /dev/null diff --git a/libvideoeditor/vss/src/NOTICE b/libvideoeditor/vss/src/NOTICE deleted file mode 100644 index c5b1efa..0000000 --- a/libvideoeditor/vss/src/NOTICE +++ /dev/null @@ -1,190 +0,0 @@ - - Copyright (c) 2005-2008, 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. - - 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. - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/libvideoeditor/vss/src/VideoEditorResampler.cpp b/libvideoeditor/vss/src/VideoEditorResampler.cpp deleted file mode 100755 index 53537f0..0000000 --- a/libvideoeditor/vss/src/VideoEditorResampler.cpp +++ /dev/null @@ -1,172 +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. - */ - -#define LOG_NDEBUG 1 -#include <audio_utils/primitives.h> -#include <utils/Log.h> -#include "AudioResampler.h" -#include "VideoEditorResampler.h" - -namespace android { - -struct VideoEditorResampler : public AudioBufferProvider { - - public: - - virtual status_t getNextBuffer(Buffer* buffer, int64_t pts); - virtual void releaseBuffer(Buffer* buffer); - - enum { //Sampling freq - kFreq8000Hz = 8000, - kFreq11025Hz = 11025, - kFreq12000Hz = 12000, - kFreq16000Hz = 16000, - kFreq22050Hz = 22050, - kFreq24000Hz = 24000, - kFreq32000Hz = 32000, - kFreq44100 = 44100, - kFreq48000 = 48000, - }; - - AudioResampler *mResampler; - int16_t* mInput; - int nbChannels; - int nbSamples; - M4OSA_Int32 outSamplingRate; - M4OSA_Int32 inSamplingRate; - - int16_t *mTmpInBuffer; -}; - -#define MAX_SAMPLEDURATION_FOR_CONVERTION 40 //ms - -status_t VideoEditorResampler::getNextBuffer(AudioBufferProvider::Buffer *pBuffer, int64_t pts) { - - uint32_t dataSize = pBuffer->frameCount * this->nbChannels * sizeof(int16_t); - mTmpInBuffer = (int16_t*)malloc(dataSize); - memcpy(mTmpInBuffer, this->mInput, dataSize); - pBuffer->raw = (void*)mTmpInBuffer; - - return OK; -} - -void VideoEditorResampler::releaseBuffer(AudioBufferProvider::Buffer *pBuffer) { - - if(pBuffer->raw != NULL) { - free(pBuffer->raw); - pBuffer->raw = NULL; - mTmpInBuffer = NULL; - } - pBuffer->frameCount = 0; -} - -extern "C" { - -M4OSA_Context LVAudioResamplerCreate(M4OSA_Int32 bitDepth, M4OSA_Int32 inChannelCount, - M4OSA_Int32 sampleRate, M4OSA_Int32 quality) { - - VideoEditorResampler *context = new VideoEditorResampler(); - context->mResampler = AudioResampler::create( - bitDepth, inChannelCount, sampleRate); - if (context->mResampler == NULL) { - return NULL; - } - context->mResampler->setSampleRate(android::VideoEditorResampler::kFreq32000Hz); - context->mResampler->setVolume(0x1000, 0x1000); - context->nbChannels = inChannelCount; - context->outSamplingRate = sampleRate; - context->mInput = NULL; - context->mTmpInBuffer = NULL; - - return ((M4OSA_Context )context); -} - - -void LVAudiosetSampleRate(M4OSA_Context resamplerContext, M4OSA_Int32 inSampleRate) { - - VideoEditorResampler *context = - (VideoEditorResampler *)resamplerContext; - context->mResampler->setSampleRate(inSampleRate); - /* - * nbSamples is calculated for 40ms worth of data;hence sample rate - * is used to calculate the nbSamples - */ - context->inSamplingRate = inSampleRate; - // Allocate buffer for maximum allowed number of samples. - context->mInput = (int16_t*)malloc( (inSampleRate * MAX_SAMPLEDURATION_FOR_CONVERTION * - context->nbChannels * sizeof(int16_t)) / 1000); -} - -void LVAudiosetVolume(M4OSA_Context resamplerContext, M4OSA_Int16 left, M4OSA_Int16 right) { - - VideoEditorResampler *context = - (VideoEditorResampler *)resamplerContext; - context->mResampler->setVolume(left,right); -} - -void LVDestroy(M4OSA_Context resamplerContext) { - - VideoEditorResampler *context = - (VideoEditorResampler *)resamplerContext; - - if (context->mTmpInBuffer != NULL) { - free(context->mTmpInBuffer); - context->mTmpInBuffer = NULL; - } - - if (context->mInput != NULL) { - free(context->mInput); - context->mInput = NULL; - } - - if (context->mResampler != NULL) { - delete context->mResampler; - context->mResampler = NULL; - } - - if (context != NULL) { - delete context; - context = NULL; - } -} - -void LVAudioresample_LowQuality(M4OSA_Int16* out, M4OSA_Int16* input, - M4OSA_Int32 outFrameCount, M4OSA_Context resamplerContext) { - - VideoEditorResampler *context = - (VideoEditorResampler *)resamplerContext; - int32_t *pTmpBuffer = NULL; - - context->nbSamples = (context->inSamplingRate * outFrameCount) / context->outSamplingRate; - memcpy(context->mInput,input,(context->nbSamples * context->nbChannels * sizeof(int16_t))); - - /* - SRC module always gives stereo output, hence 2 for stereo audio - */ - pTmpBuffer = (int32_t*)malloc(outFrameCount * 2 * sizeof(int32_t)); - memset(pTmpBuffer, 0x00, outFrameCount * 2 * sizeof(int32_t)); - - context->mResampler->resample((int32_t *)pTmpBuffer, - (size_t)outFrameCount, (VideoEditorResampler *)resamplerContext); - // Convert back to 16 bits - ditherAndClamp((int32_t*)out, pTmpBuffer, outFrameCount); - free(pTmpBuffer); - pTmpBuffer = NULL; -} - -} - -} //namespace android |