/* * 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__ */