/*
* 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.
*/
#ifndef __M4XVSS_INTERNAL_H__
#define __M4XVSS_INTERNAL_H__
/**
******************************************************************************
* @file M4xVSS_Internal.h
* @brief Internal of Video Authoring.
* @note
******************************************************************************
*/
#include "NXPSW_CompilerSwitches.h"
#include "M4MCS_API.h"
#include "M4MCS_ErrorCodes.h"
#include "M4PTO3GPP_API.h"
#include "M4PTO3GPP_ErrorCodes.h"
#include "M4AIR_API.h"
#ifdef __cplusplus
extern "C" {
#endif
#define M4_xVSS_MAJOR 1
#define M4_xVSS_MINOR 5
#define M4_xVSS_REVISION 5
/* The following defines describe the max dimensions of an input JPG */
#define M4XVSS_MX_JPG_NB_OF_PIXELS 3926016
/*Size of the UTF temporary conversion buffer keep in the VA internal context and
allocate at the initialization*/
#define UTF_CONVERSION_BUFFER_SIZE 2048
/* Max path length size */
#define M4XVSS_MAX_PATH_LEN 256
/** Determine absolute value of a. */
#define M4xVSS_ABS(a) ( ( (a) < (0) ) ? (-(a)) : (a) )
/** Y,U,V values in case of black borders rendering */
#define Y_PLANE_BORDER_VALUE 0x00
#define U_PLANE_BORDER_VALUE 0x80
#define V_PLANE_BORDER_VALUE 0x80
/**
******************************************************************************
* struct M4xVSS_EffectsAlphaBlending
* @brief Internal effects alpha blending parameters
* @note This structure contains all internal informations to create an alpha
* blending for the effects text and framing
******************************************************************************
*/
typedef struct
{
M4OSA_UInt8 m_fadeInTime; /*Start percentage of Alpha blending*/
M4OSA_UInt8 m_fadeOutTime; /*Middle percentage of Alpha blending*/
M4OSA_UInt8 m_end; /*End percentage of Alpha blending*/
M4OSA_UInt8 m_middle; /*Duration, in percentage of effect duration,
of the FadeIn phase*/
M4OSA_UInt8 m_start; /*Duration, in percentage of effect duration,
of the FadeOut phase*/
} M4xVSS_internalEffectsAlphaBlending;
/**
******************************************************************************
* THIS STRUCTURE MUST NOT BE MODIFIED
* struct M4xVSS_FramingStruct
* @brief It is used internally by xVSS for framing effect, and by VPS for previewing
******************************************************************************
*/
typedef struct
{
M4VIFI_ImagePlane *FramingRgb; /**< decoded BGR565 plane */
M4VIFI_ImagePlane *FramingYuv; /**< converted YUV420 planar plane */
M4OSA_Int32 duration; /**< Duration of the frame */
M4OSA_Int32 previousClipTime; /**< Previous clip time, used by framing
filter for SAVING */
M4OSA_Int32 previewOffsetClipTime; /**< Previous clip time, used by framing
filter for PREVIEW */
M4OSA_Int32 previewClipTime; /**< Current clip time, used by framing
filter for PREVIEW */
M4OSA_Void* pCurrent; /**< Current M4xVSS_FramingStruct used by
framing filter */
M4OSA_Void* pNext; /**< Next M4xVSS_FramingStruct, if no more,
point on current M4xVSS_FramingStruct */
M4OSA_UInt32 topleft_x; /**< The top-left X coordinate in the output
picture of the first decoded pixel */
M4OSA_UInt32 topleft_y; /**< The top-left Y coordinate in the output
picture of the first decoded pixel */
M4xVSS_internalEffectsAlphaBlending* alphaBlendingStruct; /* Alpha blending Struct */
/*To support ARGB8888 : get the width and height in case of file ARGB888 used in framing
as video effect */
M4OSA_UInt32 width; /*width of the ARGB8888 clip
.Used only if video effect is framming */
M4OSA_UInt32 height; /*height of the ARGB8888 clip .
Used only if video effect is framming */
} M4xVSS_FramingStruct;
#ifdef DECODE_GIF_ON_SAVING
/**
******************************************************************************
* THIS STRUCTURE MUST NOT BE MODIFIED
* struct M4xVSS_FramingContext
* @brief It is used internally by xVSS for framing effect, when the flag
DECODE_GIF_ON_SAVING is activated
******************************************************************************
*/
typedef struct
{
M4xVSS_FramingStruct* aFramingCtx; /**<Framing struct for the decoding
of the current frame of the gif*/
M4xVSS_FramingStruct* aFramingCtx_last; /**<Framing struct for the decoding of
the previous frame of the gif*/
M4OSA_FileReadPointer* pFileReadPtr; /**< Pointer on OSAL file read functions */
M4OSA_FileWriterPointer* pFileWritePtr; /**< Pointer on OSAL file write functions */
M4OSA_Void* pSPSContext; /**<SPS context for the GIF decoding*/
//M4SPS_Stream inputStream; /**<GIF input stream buffer pointer*/
M4OSA_Void* pEffectFilePath; /**<file path of the gif*/
M4VIDEOEDITING_VideoFrameSize outputVideoSize; /**< Output video size RC */
//M4SPS_DisposalMode disposal; /**<previous frame GIF disposal*/
M4OSA_UInt16 b_animated; /**<Is the GIF animated?*/
M4OSA_Bool bEffectResize; /**<Is the gif resize*/
M4OSA_UInt32 topleft_x; /**< The top-left X coordinate in the
output picture of the first
decoded pixel */
M4OSA_UInt32 topleft_y; /**< The top-left Y coordinate in the
output picture of the first
decoded pixel */
M4OSA_UInt32 width; /**<GIF width, fill during the
initialization with the SPS*/
M4OSA_UInt32 height; /**<GIF height, fill during the
initialization with the SPS*/
M4OSA_UInt32 effectDuration; /**<Effect duration*/
M4OSA_Int32 effectStartTime; /**<Effect start time*/
M4OSA_UInt32 clipTime; /**<current output clip time for the
current frame*/
M4OSA_UInt32 last_clipTime; /**<previous output clip time for the
previous frame*/
M4OSA_UInt32 lastStepDuration; /**<Time interval between the previous
frame and the current frame*/
M4OSA_Bool b_IsFileGif; /**<Is the framing using a gif file*/
M4OSA_UInt32 last_width; /**<Last frame width*/
M4OSA_UInt32 last_height; /**<Last frame height*/
M4OSA_UInt32 last_topleft_x; /**<Last frame x topleft*/
M4OSA_UInt32 last_topleft_y; /**<Last frame y topleft*/
M4OSA_UInt32 current_gif_time; /**< Current time os the GIF in output
file time */
M4OSA_Float frameDurationRatio; /**< Frame duration ratio */
M4xVSS_internalEffectsAlphaBlending* alphaBlendingStruct;/*Alpha blending structure*/
#ifdef DEBUG_GIF
M4OSA_UInt8 uiDebug_fileCounter;/**<for debug purpose,
count the frame of the gif*/
#endif /*DEBUG_GIF*/
}M4xVSS_FramingContext;
#endif /*DECODE_GIF_ON_SAVING*/
/**
******************************************************************************
* struct M4xVSS_Pto3GPP_params
* @brief Internal xVSS parameter for Pto3GPP module
* @note This structure is filled by M4xVSS_sendCommand function,
* @note and is used during M4xVSS_Step function to initialize Pto3GPP module
* @note All the JPG files to transform to 3GP are chained
******************************************************************************
*/
typedef struct {
M4OSA_Char* pFileIn;
M4OSA_Char* pFileOut;
M4OSA_Char* pFileTemp; /**< temporary file used for
metadata writing, NULL is cstmem
writer not used */
M4OSA_UInt32 duration;
M4VIDEOEDITING_FileType InputFileType;
M4OSA_Bool isCreated; /**< This boolean is used to know if
the output file is already
created or not */
M4OSA_Bool isPanZoom; /**< RC: Boolean used to know if the
pan and zoom mode is enabled */
M4OSA_UInt16 PanZoomXa; /**< RC */
M4OSA_UInt16 PanZoomTopleftXa; /**< RC */
M4OSA_UInt16 PanZoomTopleftYa; /**< RC */
M4OSA_UInt16 PanZoomXb; /**< RC */
M4OSA_UInt16 PanZoomTopleftXb; /**< RC */
M4OSA_UInt16 PanZoomTopleftYb; /**< RC */
M4xVSS_MediaRendering MediaRendering; /**< FB: to render or not picture
aspect ratio */
M4VIDEOEDITING_VideoFramerate framerate; /**< RC */
M4OSA_Void* pNext; /**< Address of next M4xVSS_Pto3GPP_params*
element */
/*To support ARGB8888:width and height */
M4OSA_UInt32 width;
M4OSA_UInt32 height;
} M4xVSS_Pto3GPP_params;
/**
******************************************************************************
* struct M4xVSS_fiftiesStruct
* @brief It is used internally by xVSS for fifties effect
******************************************************************************
*/
typedef struct
{
M4OSA_UInt32 fiftiesEffectDuration; /**< Duration of the same effect in a video */
M4OSA_Int32 previousClipTime; /**< Previous clip time, used by framing filter
for SAVING */
M4OSA_UInt32 shiftRandomValue; /**< Vertical shift of the image */
M4OSA_UInt32 stripeRandomValue; /**< Horizontal position of the stripe */
} M4xVSS_FiftiesStruct;
/**
******************************************************************************
* struct M4xVSS_ColorRGB16
* @brief It is used internally by xVSS for RGB16 color effect
******************************************************************************
*/
typedef struct
{
M4xVSS_VideoEffectType colorEffectType; /*Color type of effect*/
M4OSA_UInt16 rgb16ColorData; /*RGB16 color only for the RGB16 color effect*/
} M4xVSS_ColorStruct;
/**
******************************************************************************
* struct M4xVSS_PictureCallbackCtxt
* @brief The Callback Context parameters for Pto3GPP
******************************************************************************
*/
typedef struct
{
M4OSA_Char* m_FileIn;
M4OSA_UInt32 m_NbImage;
M4OSA_UInt32 m_ImageCounter;
M4OSA_Double m_timeDuration;
M4OSA_FileReadPointer* m_pFileReadPtr;
M4VIFI_ImagePlane* m_pDecodedPlane; /* Used for Pan and Zoom only */
M4xVSS_Pto3GPP_params* m_pPto3GPPparams;
M4OSA_Context m_air_context;
M4xVSS_MediaRendering m_mediaRendering;
} M4xVSS_PictureCallbackCtxt;
/**
******************************************************************************
* enum M4xVSS_State
* @brief Internal State of the xVSS
******************************************************************************
*/
typedef enum
{
M4xVSS_kStateInitialized = 0,
M4xVSS_kStateAnalyzing,
M4xVSS_kStateOpened,
//M4xVSS_kStateGeneratingPreview,
//M4xVSS_kStatePreview,
M4xVSS_kStateSaving,
M4xVSS_kStateSaved
} M4xVSS_State;
/**
******************************************************************************
* enum M4xVSS_editMicroState
* @brief Internal Micro state of the xVSS for previewing/saving states
******************************************************************************
*/
typedef enum
{
M4xVSS_kMicroStateEditing = 0,
M4xVSS_kMicroStateAudioMixing
} M4xVSS_editMicroState;
/**
******************************************************************************
* enum M4xVSS_editMicroState
* @brief Internal Micro state of the xVSS for analyzing states
******************************************************************************
*/
typedef enum
{
M4xVSS_kMicroStateAnalysePto3GPP = 0,
M4xVSS_kMicroStateConvertPto3GPP,
M4xVSS_kMicroStateAnalyzeMCS,
M4xVSS_kMicroStateTranscodeMCS
} M4xVSS_analyseMicroState;
/**
******************************************************************************
* struct M4xVSS_MCS_params
* @brief Internal xVSS parameter for MCS module
* @note This structure is filled by M4xVSS_sendCommand function,
* @note and is used during M4xVSS_Step function to initialize MCS module
* @note All the input files to transcode are chained
******************************************************************************
*/
typedef struct {
M4OSA_Void* pFileIn;
M4OSA_Void* pFileOut;
/**< temporary file used for metadata writing, NULL is cstmem writer not used */
M4OSA_Void* pFileTemp;
M4VIDEOEDITING_FileType InputFileType;
M4VIDEOEDITING_FileType OutputFileType;
M4VIDEOEDITING_VideoFormat OutputVideoFormat;
M4VIDEOEDITING_VideoFrameSize OutputVideoFrameSize;
M4VIDEOEDITING_VideoFramerate OutputVideoFrameRate;
M4VIDEOEDITING_AudioFormat OutputAudioFormat;
M4VIDEOEDITING_AudioSamplingFrequency OutputAudioSamplingFrequency;
M4OSA_Bool bAudioMono;
M4VIDEOEDITING_Bitrate OutputVideoBitrate;
M4VIDEOEDITING_Bitrate OutputAudioBitrate;
M4OSA_Bool isBGM;
/**< This boolean is used to know if the output file is already created or not */
M4OSA_Bool isCreated;
/**< Address of next M4xVSS_MCS_params* element */
M4OSA_Void* pNext;
/*FB: transcoding per parts*/
M4OSA_UInt32 BeginCutTime; /**< Beginning cut time in input file */
M4OSA_UInt32 EndCutTime; /**< End cut time in input file */
M4OSA_UInt32 OutputVideoTimescale; /*Output timescale*/
M4MCS_MediaRendering MediaRendering; /**< FB: to crop, resize, or render
black borders*/
M4OSA_UInt32 videoclipnumber;
M4OSA_UInt32 outputVideoProfile;
M4OSA_UInt32 outputVideoLevel;
} M4xVSS_MCS_params;
/**
******************************************************************************
* struct M4xVSS_internal_AlphaMagicSettings
* @brief This structure defines the alpha magic transition settings
******************************************************************************
*/
typedef struct {
M4VIFI_ImagePlane *pPlane;
M4OSA_Int32 blendingthreshold; /**< Blending Range */
M4OSA_Bool isreverse; /**< direct effect or reverse */
} M4xVSS_internal_AlphaMagicSettings;
/**
******************************************************************************
* struct M4xVSS_internal_SlideTransitionSettings
* @brief This structure defines the internal slide transition settings
* @note This type happens to match the external transition settings
* structure (i.e. the one which is given by the application), but are
* conceptually different types, so that if (or rather when) some day
* translation needs to occur when loading the settings from the app,
* this separate type will already be ready.
******************************************************************************
*/
typedef M4xVSS_SlideTransitionSettings M4xVSS_internal_SlideTransitionSettings;
/**
******************************************************************************
* struct M4xVSS_internalJpegChunkMode
* @brief This structure defines the parameters of the chunk callback to decode
* a JPEG by chunk mode.
******************************************************************************
*/
/**
******************************************************************************
* struct M4xVSS_UTFConversionContext
* @brief Internal UTF conversion context
* @note This structure contains the UTF conversion informations
* needed by the xVSS to manage the different formats (UTF8/16/ASCII)
******************************************************************************
*/
typedef struct
{
/*Function pointer on an external text conversion function */
M4xVSS_toUTF8Fct pConvToUTF8Fct;
/*Function pointer on an external text conversion function */
M4xVSS_fromUTF8Fct pConvFromUTF8Fct;
/*Temporary buffer that contains the result of each conversion*/
M4OSA_Void* pTempOutConversionBuffer;
/*Size of the previous buffer, the size is prederminated*/
M4OSA_UInt32 m_TempOutConversionSize;
} M4xVSS_UTFConversionContext;
/**
******************************************************************************
* struct M4xVSS_Context
* @brief Internal context of the xVSS
* @note This structure contains all internal informations needed by the xVSS
******************************************************************************
*/
typedef struct {
/**< Pointer on OSAL file read functions */
M4OSA_FileReadPointer* pFileReadPtr;
/**< Pointer on OSAL file write functions */
M4OSA_FileWriterPointer* pFileWritePtr;
/**< Local copy of video editor settings */
M4VSS3GPP_EditSettings* pSettings;
/**< Current Settings of video editor to use in step functions for preview/save */
M4VSS3GPP_EditSettings* pCurrentEditSettings;
/**< Current context of video editor to use in step functions for preview/save */
M4VSS3GPP_EditContext pCurrentEditContext;
/**< This is to know if a previous M4xVSS_sendCommand has already been called */
M4OSA_UInt8 previousClipNumber;
/**< Audio mixing settings, needed to free it in M4xVSS_internalCloseAudioMixedFile function*/
M4VSS3GPP_AudioMixingSettings* pAudioMixSettings;
/**< Audio mixing context */
M4VSS3GPP_AudioMixingContext pAudioMixContext;
/**< File path for PCM output file: used for preview, given to user */
M4OSA_Char* pcmPreviewFile;
/**< Duplication of output file pointer, to be able to use audio mixing */
M4OSA_Char* pOutputFile;
/**< Duplication of temporary file pointer, to be able to use audio mixing */
M4OSA_Char* pTemporaryFile;
/**< Micro state for Saving/Previewing state */
M4xVSS_editMicroState editingStep;
/**< Micro state for Analyzing state */
M4xVSS_analyseMicroState analyseStep;
/**< Nb of step for analysis or save/preview. Used to compute progression
of analysis or save/preview */
M4OSA_UInt8 nbStepTotal;
/**< Current step number for analysis or save/preview */
M4OSA_UInt8 currentStep;
/**< To be able to free pEffects during preview close */
M4xVSS_PreviewSettings* pPreviewSettings;
/**< Temporary file path: all temporary files are created here */
M4OSA_Char* pTempPath;
/**< Current state of xVSS */
M4xVSS_State m_state;
/**< List of still pictures input to convert to 3GP with parameters */
M4xVSS_Pto3GPP_params* pPTo3GPPparamsList;
/**< Current element of the above chained list beeing processd by the Pto3GPP */
M4xVSS_Pto3GPP_params* pPTo3GPPcurrentParams;
/**< Current Pto3GPP context, needed to call Pto3GPP_step function in M4xVSS_step function */
M4PTO3GPP_Context pM4PTO3GPP_Ctxt;
/**< Pointer on the callback function of the Pto3GPP module */
M4xVSS_PictureCallbackCtxt* pCallBackCtxt;
/**< List of files to transcode with parameters */
M4xVSS_MCS_params* pMCSparamsList;
/**< Current element of the above chained list beeing processd by the MCS */
M4xVSS_MCS_params* pMCScurrentParams;
/**< Current MCS context, needed to call MCS_step function in M4xVSS_step function*/
M4MCS_Context pMCS_Ctxt;
/**< Index to have unique temporary filename */
M4OSA_UInt32 tempFileIndex;
/**< In case of MMS use case, targeted bitrate to reach output file size */
M4OSA_UInt32 targetedBitrate;
/**< If the sendCommand fct is called twice or more, the first computed timescale
recorded here must be reused */
M4OSA_UInt32 targetedTimescale;
/*UTF Conversion support*/
M4xVSS_UTFConversionContext UTFConversionContext; /*UTF conversion context structure*/
} M4xVSS_Context;
/**
* Internal function prototypes */
M4OSA_ERR M4xVSS_internalStartTranscoding(M4OSA_Context pContext,
M4OSA_UInt32 *rotationDegree);
M4OSA_ERR M4xVSS_internalStopTranscoding(M4OSA_Context pContext);
M4OSA_ERR M4xVSS_internalDecodeJPG(M4OSA_Void* pFileIn, M4OSA_FileReadPointer* pFileReadPtr,
M4VIFI_ImagePlane** pImagePlanes);
M4OSA_ERR M4xVSS_internalConvertARGB8888toYUV420(M4OSA_Void* pFileIn,
M4OSA_FileReadPointer* pFileReadPtr,
M4VIFI_ImagePlane** pImagePlanes,
M4OSA_UInt32 width,M4OSA_UInt32 height);
M4OSA_ERR M4xVSS_internalDecodeAndResizeJPG(M4OSA_Void* pFileIn,
M4OSA_FileReadPointer* pFileReadPtr,
M4VIFI_ImagePlane* pImagePlanes);
M4OSA_ERR M4xVSS_internalConvertAndResizeARGB8888toYUV420(M4OSA_Void* pFileIn,
M4OSA_FileReadPointer* pFileReadPtr,
M4VIFI_ImagePlane* pImagePlanes,
M4OSA_UInt32 width,M4OSA_UInt32 height);
M4OSA_ERR M4xVSS_internalStartConvertPictureTo3gp(M4OSA_Context pContext);
M4OSA_ERR M4xVSS_internalStopConvertPictureTo3gp(M4OSA_Context pContext);
M4OSA_ERR M4xVSS_internalConvertRGBtoYUV(M4xVSS_FramingStruct* framingCtx);
#ifdef DECODE_GIF_ON_SAVING
M4OSA_ERR M4xVSS_internalDecodeGIF(M4OSA_Context pContext);
M4OSA_ERR M4xVSS_internalDecodeGIF_Initialization(M4OSA_Context pContext);
M4OSA_ERR M4xVSS_internalDecodeGIF_Cleaning(M4OSA_Context pContext);
#else
M4OSA_ERR M4xVSS_internalDecodeGIF(M4OSA_Context pContext, M4VSS3GPP_EffectSettings* pEffect,
M4xVSS_FramingStruct* framingCtx);
#endif /*DECODE_GIF_ON_SAVING*/
M4OSA_ERR M4xVSS_internalConvertARGB888toYUV420_FrammingEffect(M4OSA_Context pContext,
M4VSS3GPP_EffectSettings* pEffect,
M4xVSS_FramingStruct* framingCtx,
M4VIDEOEDITING_VideoFrameSize \
OutputVideoResolution);
M4OSA_ERR M4xVSS_internalGenerateEditedFile(M4OSA_Context pContext);
M4OSA_ERR M4xVSS_internalCloseEditedFile(M4OSA_Context pContext);
M4OSA_ERR M4xVSS_internalGenerateAudioMixFile(M4OSA_Context pContext);
M4OSA_ERR M4xVSS_internalCloseAudioMixedFile(M4OSA_Context pContext);
M4OSA_ERR M4xVSS_internalFreePreview(M4OSA_Context pContext);
M4OSA_ERR M4xVSS_internalFreeSaving(M4OSA_Context pContext);
M4OSA_ERR M4xVSS_freeSettings(M4VSS3GPP_EditSettings* pSettings);
M4OSA_ERR M4xVSS_freeCommand(M4OSA_Context pContext);
M4OSA_ERR M4xVSS_internalGetProperties(M4OSA_Context pContext, M4OSA_Char* pFile,
M4VIDEOEDITING_ClipProperties *pFileProperties);
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 M4xVSS_AlphaMagicBlending( M4OSA_Void *userData, M4VIFI_ImagePlane PlaneIn1[3],
M4VIFI_ImagePlane PlaneIn2[3], M4VIFI_ImagePlane *PlaneOut,
M4VSS3GPP_ExternalProgress *pProgress,
M4OSA_UInt32 uiTransitionKind);
M4OSA_ERR M4xVSS_SlideTransition( M4OSA_Void *userData, M4VIFI_ImagePlane PlaneIn1[3],
M4VIFI_ImagePlane PlaneIn2[3], M4VIFI_ImagePlane *PlaneOut,
M4VSS3GPP_ExternalProgress *pProgress,
M4OSA_UInt32 uiTransitionKind);
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_ERR M4xVSS_internalGetTargetedTimeScale(M4OSA_Context pContext,
M4VSS3GPP_EditSettings* pSettings,
M4OSA_UInt32* pTargetedTimeScale);
M4OSA_ERR M4xVSS_internalConvertToUTF8(M4OSA_Context pContext, M4OSA_Void* pBufferIn,
M4OSA_Void* pBufferOut, M4OSA_UInt32* convertedSize);
M4OSA_ERR M4xVSS_internalConvertFromUTF8(M4OSA_Context pContext, M4OSA_Void* pBufferIn,
M4OSA_Void* pBufferOut, M4OSA_UInt32* convertedSize);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __M4XVSS_INTERNAL_H__ */