Home | History | Annotate | Download | only in inc
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef __M4VSS3GPP_API_H__
     18 #define __M4VSS3GPP_API_H__
     19 
     20 /**
     21  ******************************************************************************
     22  * @file    M4VSS3GPP_API.h
     23  * @brief   Video Studio Service 3GPP public API.
     24  * @note    VSS allows editing 3GPP files.
     25  *          It is a straightforward and fully synchronous API.
     26  ******************************************************************************
     27  */
     28 
     29 /**
     30  *  OSAL basic types and errors */
     31 #include "M4OSA_Types.h"
     32 #include "M4OSA_Error.h"
     33 
     34 /**
     35  *  OSAL types for file access */
     36 #include "M4OSA_FileReader.h"
     37 #include "M4OSA_FileWriter.h"
     38 
     39 /**
     40  *  Definition of M4_VersionInfo */
     41 #include "M4TOOL_VersionInfo.h"
     42 
     43 /**
     44  * Image planes definition */
     45 #include "M4VIFI_FiltersAPI.h"
     46 
     47 /**
     48  * Common definitions of video editing components */
     49 #include "M4_VideoEditingCommon.h"
     50 #include "M4ENCODER_AudioCommon.h"
     51 #include "M4AD_Common.h"
     52 #include "M4DA_Types.h"
     53 
     54 /**
     55  * Extended API (xVSS) */
     56 #ifdef M4VSS_SUPPORT_EXTENDED_FEATURES
     57 #include "M4VSS3GPP_Extended_API.h"
     58 #endif
     59 
     60 //#include "M4VD_HW_API.h"
     61 //#include "M4VE_API.h"
     62 
     63 
     64 #ifdef __cplusplus
     65 extern "C" {
     66 #endif
     67 
     68 
     69 
     70 /**
     71  ******************************************************************************
     72  ******************************************************************************
     73  ******************************************************************************
     74  *
     75  *      Edition Feature
     76  *
     77  ******************************************************************************
     78  ******************************************************************************
     79  ******************************************************************************
     80  */
     81 
     82 /**
     83  *  Public type of the VSS edit context */
     84 typedef M4OSA_Void* M4VSS3GPP_EditContext;
     85 
     86 
     87 /**
     88  ******************************************************************************
     89  * enum     M4VSS3GPP_VideoEffectType
     90  * @brief   This enumeration defines the video effect types of the VSS3GPP
     91  ******************************************************************************
     92  */
     93 typedef enum
     94 {
     95     M4VSS3GPP_kVideoEffectType_None           = 0,  /**< No video effect */
     96     M4VSS3GPP_kVideoEffectType_FadeFromBlack  = 8,  /**< Intended for begin effect */
     97     M4VSS3GPP_kVideoEffectType_FadeToBlack    = 16, /**< Intended for end effect */
     98     M4VSS3GPP_kVideoEffectType_External       = 256 /**< External effect function is used */
     99     /* reserved 256 + n */                          /**< External effect number n */
    100 
    101 } M4VSS3GPP_VideoEffectType;
    102 
    103 
    104 /**
    105  ******************************************************************************
    106  * enum     M4VSS3GPP_AudioEffectType
    107  * @brief   This enumeration defines the audio effect types of the VSS3GPP
    108  ******************************************************************************
    109  */
    110 typedef enum
    111 {
    112     M4VSS3GPP_kAudioEffectType_None    = 0,
    113     M4VSS3GPP_kAudioEffectType_FadeIn  = 8, /**< Intended for begin effect */
    114     M4VSS3GPP_kAudioEffectType_FadeOut = 16 /**< Intended for end effect */
    115 
    116 } M4VSS3GPP_AudioEffectType;
    117 
    118 
    119 /**
    120  ******************************************************************************
    121  * enum     M4VSS3GPP_VideoTransitionType
    122  * @brief   This enumeration defines the video effect that can be applied during a transition.
    123  ******************************************************************************
    124  */
    125 typedef enum
    126 {
    127     M4VSS3GPP_kVideoTransitionType_None      = 0,
    128     M4VSS3GPP_kVideoTransitionType_CrossFade = 1,
    129     M4VSS3GPP_kVideoTransitionType_External  = 256
    130     /* reserved 256 + n */                          /**< External transition number n */
    131 
    132 } M4VSS3GPP_VideoTransitionType;
    133 
    134 
    135 /**
    136  ******************************************************************************
    137  * enum     M4VSS3GPP_AudioTransitionType
    138  * @brief   This enumeration defines the audio effect that can be applied during a transition.
    139  ******************************************************************************
    140  */
    141 typedef enum
    142 {
    143     M4VSS3GPP_kAudioTransitionType_None = 0,
    144     M4VSS3GPP_kAudioTransitionType_CrossFade
    145 
    146 } M4VSS3GPP_AudioTransitionType;
    147 
    148 
    149 /**
    150  ******************************************************************************
    151  * struct   M4VSS3GPP_ExternalProgress
    152  * @brief   This structure contains information provided to the external Effect
    153  *          and Transition functions
    154  * @note    The uiProgress value should be enough for most cases
    155  ******************************************************************************
    156  */
    157 typedef struct
    158 {
    159     /**< Progress of the Effect or the Transition, from 0 to 1000 (one thousand) */
    160     M4OSA_UInt32    uiProgress;
    161     /**< Index of the current clip (first clip in case of a Transition), from 0 to N */
    162     //M4OSA_UInt8     uiCurrentClip;
    163     /**< Current time, in milliseconds, in the current clip time-line */
    164     M4OSA_UInt32    uiClipTime;
    165     /**< Current time, in milliseconds, in the output clip time-line */
    166     M4OSA_UInt32    uiOutputTime;
    167     M4OSA_Bool        bIsLast;
    168 
    169 } M4VSS3GPP_ExternalProgress;
    170 
    171 
    172 /**
    173  ************************************************************************
    174  * enum     M4VSS3GPP_codecType
    175  * @brief    This enum defines the codec types used to create interfaces
    176  * @note    This enum is used internally by the VSS3GPP services to identify
    177  *             a currently supported codec interface. Each codec is
    178  *            registered with one of this type associated.
    179  *            When a codec instance is needed, this type is used to
    180  *            identify and retrieve its interface.
    181  *            This can be extended for other codecs.
    182  ************************************************************************
    183  */
    184 typedef enum
    185 {
    186     /* Video Decoder Types */
    187     M4VSS3GPP_kVideoDecMPEG4 = 0,
    188     M4VSS3GPP_kVideoDecH264,
    189 
    190     /* Video Encoder Types */
    191     M4VSS3GPP_kVideoEncMPEG4,
    192     M4VSS3GPP_kVideoEncH263,
    193     M4VSS3GPP_kVideoEncH264,
    194 
    195     /* Audio Decoder Types */
    196     M4VSS3GPP_kAudioDecAMRNB,
    197     M4VSS3GPP_kAudioDecAAC,
    198     M4VSS3GPP_kAudioDecMP3,
    199 
    200     /* Audio Encoder Types */
    201     M4VSS3GPP_kAudioEncAMRNB,
    202     M4VSS3GPP_kAudioEncAAC,
    203 
    204     /* number of codecs, keep it as last enum entry, before invlaid type */
    205     M4VSS3GPP_kCodecType_NB,
    206     /* invalid codec type */
    207     M4VSS3GPP_kCodecTypeInvalid = 255
    208 
    209 } M4VSS3GPP_codecType;
    210 
    211 
    212 /**
    213  ******************************************************************************
    214  * prototype    M4VSS3GPP_editVideoEffectFct
    215  * @brief       Begin and End video effect functions implemented by the integrator
    216  *              must match this prototype.
    217  * @note        The function is provided with the original image of the clip.
    218  *              It must apply the video effect to build the output image.
    219  *              The progress of the effect is given, on a scale from 0 to 1000.
    220  *              When the effect function is called, all the image plane structures
    221  *              and buffers are valid and owned by the VSS 3GPP.
    222  *
    223  * @param   pFunctionContext    (IN) The function context, previously set by the integrator
    224  * @param   pInputPlanes        (IN) Input YUV420 image: pointer to an array of three valid
    225                                      image planes (Y, U and V)
    226  * @param   pOutputPlanes       (IN/OUT) Output (filtered) YUV420 image: pointer to an array
    227                                          of three valid image planes (Y, U and V)
    228  * @param   pProgress           (IN) Set of information about the video transition progress.
    229  * @param   uiExternalEffectId  (IN) Which effect function should be used (for external effects)
    230  *
    231  * @return  M4NO_ERROR:         No error
    232  * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
    233  ******************************************************************************
    234  */
    235 typedef M4OSA_ERR (*M4VSS3GPP_editVideoEffectFct)
    236 (
    237     M4OSA_Void *pFunctionContext,
    238     M4VIFI_ImagePlane *pInputPlanes,
    239     M4VIFI_ImagePlane *pOutputPlanes,
    240     M4VSS3GPP_ExternalProgress *pProgress,
    241     M4OSA_UInt32 uiExternalEffectId
    242 );
    243 
    244 
    245 /**
    246  ******************************************************************************
    247  * prototype    M4VSS3GPP_editVideoTransitionFct
    248  * @brief       External transition functions implemented by the integrator
    249  *              must match this prototype.
    250  * @note        The function is provided with the image of the first clip and
    251  *              the image of the second clip. It must build the output image
    252  *              from the two input images.
    253  *              The progress of the transition is given, on a scale from 0 to 1000.
    254  *              When the external function is called, all the image plane
    255  *              structures and buffers are valid and owned by the VSS 3GPP.
    256  *
    257  * @param   pFunctionContext    (IN) The function context, previously set by the integrator
    258  * @param   pClip1InputPlanes   (IN) First input YUV420 image: pointer to an array of three
    259                                      valid image planes (Y, U and V)
    260  * @param   pClip2InputPlanes   (IN) Second input YUV420 image: pointer to an array of three
    261                                      valid image planes (Y, U and V)
    262  * @param   pOutputPlanes       (IN/OUT) Output (filtered) YUV420 image: pointer to an array
    263                                          of three valid image planes (Y, U and V)
    264  * @param   pProgress           (IN) Set of information about the video effect progress.
    265  * @param   uiExternalTransitionId    (IN) Which transition function should be used
    266                                             (for external transitions)
    267  *
    268  * @return  M4NO_ERROR:         No error
    269  * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
    270  ******************************************************************************
    271  */
    272 typedef M4OSA_ERR (*M4VSS3GPP_editVideoTransitionFct)
    273 (
    274     M4OSA_Void *pFunctionContext,
    275     M4VIFI_ImagePlane *pClip1InputPlanes,
    276     M4VIFI_ImagePlane *pClip2InputPlanes,
    277     M4VIFI_ImagePlane *pOutputPlanes,
    278     M4VSS3GPP_ExternalProgress *pProgress,
    279     M4OSA_UInt32 uiExternalTransitionId
    280 );
    281 
    282 
    283 /**
    284  ******************************************************************************
    285  * struct   M4VSS3GPP_EffectSettings
    286  * @brief   This structure defines an audio/video effect for the edition.
    287  * @note    Effect start time is relative to output clip.
    288  ******************************************************************************
    289  */
    290 typedef struct
    291 {
    292     M4OSA_UInt32                 uiStartTime;           /**< In ms */
    293     M4OSA_UInt32                 uiDuration;            /**< In ms */
    294     M4VSS3GPP_VideoEffectType    VideoEffectType;       /**< None, FadeIn, FadeOut, etc. */
    295     M4VSS3GPP_editVideoEffectFct ExtVideoEffectFct;     /**< External effect function */
    296     M4OSA_Void                  *pExtVideoEffectFctCtxt;/**< Context given to the external
    297                                                              effect function */
    298     M4VSS3GPP_AudioEffectType    AudioEffectType;       /**< None, FadeIn, FadeOut */
    299 
    300 #ifdef M4VSS_SUPPORT_EXTENDED_FEATURES
    301     M4xVSS_EffectSettings         xVSS;
    302 #endif
    303 
    304 } M4VSS3GPP_EffectSettings;
    305 
    306 
    307 /**
    308  ******************************************************************************
    309  * enum        M4VSS3GPP_TransitionBehaviour
    310  * @brief    Transition behavior
    311  ******************************************************************************
    312  */
    313 typedef enum
    314 {
    315     M4VSS3GPP_TransitionBehaviour_SpeedUp = 0,
    316     M4VSS3GPP_TransitionBehaviour_Linear,
    317     M4VSS3GPP_TransitionBehaviour_SpeedDown,
    318     M4VSS3GPP_TransitionBehaviour_SlowMiddle,
    319     M4VSS3GPP_TransitionBehaviour_FastMiddle
    320 } M4VSS3GPP_TransitionBehaviour;
    321 
    322 
    323 /**
    324  ******************************************************************************
    325  * struct   M4VSS3GPP_TransitionSettings
    326  * @brief   This structure defines the transition to be applied when assembling two clips.
    327  ******************************************************************************
    328  */
    329 typedef struct
    330 {
    331     /**< Duration of the transition, in milliseconds (set to 0 to get no transition) */
    332     M4OSA_UInt32                     uiTransitionDuration;
    333 
    334     /**< Type of the video transition */
    335     M4VSS3GPP_VideoTransitionType    VideoTransitionType;
    336 
    337     /**< External transition video effect function */
    338     M4VSS3GPP_editVideoTransitionFct ExtVideoTransitionFct;
    339 
    340     /**< Context of the external transition video effect function */
    341     M4OSA_Void                      *pExtVideoTransitionFctCtxt;
    342     M4VSS3GPP_AudioTransitionType    AudioTransitionType;   /**< Type of the audio transition */
    343     M4VSS3GPP_TransitionBehaviour     TransitionBehaviour;    /**<Transition behaviour*/
    344 
    345 #ifdef M4VSS_SUPPORT_EXTENDED_FEATURES
    346     M4xVSS_TransitionSettings        xVSS;
    347 #endif
    348 
    349 } M4VSS3GPP_TransitionSettings;
    350 
    351 
    352 /**
    353  ******************************************************************************
    354  * struct   M4VSS3GPP_ClipSettings
    355  * @brief   This structure defines an input clip for the edition.
    356  * @note    It also contains the settings for the cut and begin/end effects applied to the clip.
    357  ******************************************************************************
    358  */
    359 typedef struct
    360 {
    361     M4OSA_Void                     *pFile;            /**< Clip file descriptor */
    362     M4VIDEOEDITING_FileType         FileType;         /**< .3gp, .amr, .mp3     */
    363     M4OSA_UInt32                    filePathSize;      /**< Clip path size
    364                                                            (add because of UTF16 conversion)*/
    365     M4VIDEOEDITING_ClipProperties   ClipProperties;   /**< Clip analysis previously computed
    366                                                        with M4VSS3GPP_editAnalyseClip */
    367     M4OSA_UInt32                    uiBeginCutTime;   /**< Begin cut time, in milliseconds */
    368     M4OSA_UInt32                    uiEndCutTime;     /**< End cut time, in milliseconds */
    369     M4OSA_Bool                      bTranscodingRequired;
    370 
    371 #ifdef M4VSS_SUPPORT_EXTENDED_FEATURES
    372     M4xVSS_ClipSettings             xVSS;
    373 #endif
    374 
    375 } M4VSS3GPP_ClipSettings;
    376 
    377 
    378 /**
    379  ******************************************************************************
    380  * struct   M4VSS3GPP_EditSettings
    381  * @brief   This structure gathers all the information needed to define a complete
    382  *          edition operation
    383  ******************************************************************************
    384  */
    385 typedef struct
    386 {
    387       /**< Number of element of the clip list pClipList */
    388     M4OSA_UInt8                      uiClipNumber;
    389     /**< The properties of this clip will be used as a reference for compatibility checking */
    390     M4OSA_UInt8                      uiMasterClip;
    391     /**< List of the input clips settings. Pointer to an array of uiClipNumber
    392      clip settings pointers */
    393     M4VSS3GPP_ClipSettings           **pClipList;
    394     /**< List of the transition settings. Pointer to an array of uiClipNumber-1
    395      transition settings pointers */
    396     M4VSS3GPP_TransitionSettings     **pTransitionList;
    397     M4VSS3GPP_EffectSettings         *Effects;         /**< List of effects */
    398     M4OSA_UInt8                         nbEffects;     /**< Number of effects in the above list */
    399     /**< Frame rate at which the modified video sections will be encoded */
    400     M4VIDEOEDITING_VideoFramerate    videoFrameRate;
    401     M4OSA_Void                       *pOutputFile;      /**< Output 3GPP clip file descriptor */
    402     M4OSA_UInt32                     uiOutputPathSize;    /**< Output file path size*/
    403     /**< Temporary file to store metadata ("moov.bin") */
    404     M4OSA_Void                       *pTemporaryFile;
    405 
    406 #ifdef M4VSS_SUPPORT_EXTENDED_FEATURES
    407     M4xVSS_EditSettings              xVSS;
    408 #endif
    409     M4OSA_Float                    PTVolLevel;
    410 } M4VSS3GPP_EditSettings;
    411 
    412 
    413 /**
    414  ******************************************************************************
    415  * M4OSA_ERR M4VSS3GPP_editAnalyseClip()
    416  * @brief   This function allows checking if a clip is compatible with VSS 3GPP editing
    417  * @note    It also fills a ClipAnalysis structure, which can be used to check if two
    418  *          clips are compatible
    419  * @param   pClip               (IN) File descriptor of the input 3GPP/MP3 clip file.
    420  * @param   pClipProperties     (IN) Pointer to a valid ClipProperties structure.
    421  * @param   FileType            (IN) Type of the input file (.3gp, .amr, .mp3)
    422  * @return  M4NO_ERROR:         No error
    423  * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
    424  * @return   M4VSS3GPP_ERR_H263_PROFILE_NOT_SUPPORTED
    425  * @return   M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION
    426  * @return   M4VSS3GPP_ERR_AMR_EDITING_UNSUPPORTED
    427  * @return   M4VSS3GPP_ERR_EDITING_UNSUPPORTED_H263_PROFILE
    428  * @return   M4VSS3GPP_ERR_EDITING_UNSUPPORTED_MPEG4_PROFILE
    429  * @return   M4VSS3GPP_ERR_EDITING_UNSUPPORTED_MPEG4_RVLC
    430  * @return   M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT
    431  * @return   M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_VIDEO_STREAM_IN_FILE
    432  * @return   M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT
    433  * @return   M4VSS3GPP_ERR_EDITING_NO_SUPPORTED_STREAM_IN_FILE
    434  ******************************************************************************
    435  */
    436 M4OSA_ERR M4VSS3GPP_editAnalyseClip(M4OSA_Void *pClip, M4VIDEOEDITING_FileType FileType,
    437                                     M4VIDEOEDITING_ClipProperties  *pClipProperties,
    438                                     M4OSA_FileReadPointer *pFileReadPtrFct);
    439 
    440 /**
    441  ******************************************************************************
    442  * M4OSA_ERR M4VSS3GPP_editCheckClipCompatibility()
    443  * @brief   This function allows checking if two clips are compatible with each other
    444  *          for VSS 3GPP editing assembly feature.
    445  * @note
    446  * @param   pClip1Properties        (IN) Clip analysis of the first clip
    447  * @param   pClip2Properties        (IN) Clip analysis of the second clip
    448  * @return  M4NO_ERROR:         No error
    449  * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
    450  * @return  M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_VERSION
    451  * @return  M4VSS3GPP_ERR_INVALID_CLIP_ANALYSIS_PLATFORM
    452  * @return  M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_FORMAT
    453  * @return  M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_FRAME_SIZE
    454  * @return  M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_TIME_SCALE
    455  * @return  M4VSS3GPP_ERR_INCOMPATIBLE_VIDEO_DATA_PARTITIONING
    456  * @return  M4VSS3GPP_ERR_UNSUPPORTED_MP3_ASSEMBLY
    457  * @return  M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT
    458  ******************************************************************************
    459  */
    460 M4OSA_ERR M4VSS3GPP_editCheckClipCompatibility(M4VIDEOEDITING_ClipProperties  *pClip1Properties,
    461                                                M4VIDEOEDITING_ClipProperties  *pClip2Properties);
    462 
    463 /**
    464  ******************************************************************************
    465  * M4OSA_ERR M4VSS3GPP_editInit()
    466  * @brief    Initializes the VSS 3GPP edit operation (allocates an execution context).
    467  * @note
    468  * @param    pContext            (OUT) Pointer on the VSS 3GPP edit context to allocate
    469  * @param    pFileReadPtrFct        (IN) Pointer to OSAL file reader functions
    470  * @param   pFileWritePtrFct    (IN) Pointer to OSAL file writer functions
    471  * @return    M4NO_ERROR:            No error
    472  * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL
    473  * @return    M4ERR_ALLOC:        There is no more available memory
    474  ******************************************************************************
    475  */
    476 M4OSA_ERR M4VSS3GPP_editInit(
    477     M4VSS3GPP_EditContext* pContext,
    478     M4OSA_FileReadPointer* pFileReadPtrFct,
    479     M4OSA_FileWriterPointer* pFileWritePtrFct );
    480 
    481 /**
    482  ******************************************************************************
    483  * M4OSA_ERR M4VSS3GPP_editCreateClipSettings()
    484  * @brief    Allows filling a clip settings structure with default values
    485  *
    486  * @note    WARNING: pClipSettings->pFile      will be allocated in this function.
    487  *
    488  * @param    pClipSettings        (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
    489  * @param   pFile               (IN) Clip file name
    490  * @param   filePathSize        (IN) Size of the clip path (needed for UTF16 conversion)
    491  * @param    nbEffects           (IN) Nb of effect settings to allocate
    492  * @return    M4NO_ERROR:            No error
    493  * @return    M4ERR_PARAMETER:    pClipSettings is M4OSA_NULL (debug only)
    494  ******************************************************************************
    495  */
    496 M4OSA_ERR M4VSS3GPP_editCreateClipSettings(M4VSS3GPP_ClipSettings *pClipSettings,
    497                                            M4OSA_Void* pFile, M4OSA_UInt32 filePathSize,
    498                                            M4OSA_UInt8 nbEffects);
    499 
    500 /**
    501  ******************************************************************************
    502  * M4OSA_ERR M4VSS3GPP_editDuplicateClipSettings()
    503  * @brief    Duplicates a clip settings structure, performing allocations if required
    504  *
    505  * @param    pClipSettingsDest    (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
    506  * @param    pClipSettingsOrig    (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
    507  * @param   bCopyEffects        (IN) Flag to know if we have to duplicate effects (deprecated)
    508  * @return    M4NO_ERROR:            No error
    509  * @return    M4ERR_PARAMETER:    pClipSettings is M4OSA_NULL (debug only)
    510  ******************************************************************************
    511  */
    512 M4OSA_ERR M4VSS3GPP_editDuplicateClipSettings(M4VSS3GPP_ClipSettings *pClipSettingsDest,
    513                                               M4VSS3GPP_ClipSettings *pClipSettingsOrig,
    514                                               M4OSA_Bool bCopyEffects);
    515 
    516 /**
    517  ******************************************************************************
    518  * M4OSA_ERR M4VSS3GPP_editFreeClipSettings()
    519  * @brief    Free the pointers allocated in the ClipSetting structure (pFile, Effects).
    520  *
    521  * @param    pClipSettings        (IN) Pointer to a valid M4VSS3GPP_ClipSettings structure
    522  * @return    M4NO_ERROR:            No error
    523  * @return    M4ERR_PARAMETER:    pClipSettings is M4OSA_NULL (debug only)
    524  ******************************************************************************
    525  */
    526 M4OSA_ERR M4VSS3GPP_editFreeClipSettings(M4VSS3GPP_ClipSettings *pClipSettings);
    527 
    528 /**
    529  ******************************************************************************
    530  * M4OSA_ERR M4VSS3GPP_editOpen()
    531  * @brief   Set the VSS 3GPP input and output files, and set the settings.
    532  * @note
    533  * @param   pContext            (IN) VSS 3GPP edit context
    534  * @param   pSettings           (IN) Edit settings
    535  * @return  M4NO_ERROR:         No error
    536  * @return  M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
    537  * @return  M4ERR_STATE:        VSS is not in an appropriate state for this function to be called
    538  * @return  M4ERR_ALLOC:        There is no more available memory
    539  ******************************************************************************
    540  */
    541 M4OSA_ERR M4VSS3GPP_editOpen(M4VSS3GPP_EditContext pContext, M4VSS3GPP_EditSettings *pSettings);
    542 
    543 /**
    544  ******************************************************************************
    545  * M4OSA_ERR M4VSS3GPP_editStep()
    546  * @brief   Perform one step of editing.
    547  * @note
    548  * @param   pContext                (IN) VSS 3GPP edit context
    549  * @param   pProgress               (OUT) Progress percentage (0 to 100) of the editing operation
    550  * @return  M4NO_ERROR:             No error
    551  * @return  M4ERR_PARAMETER:        pContext is M4OSA_NULL (debug only)
    552  * @return  M4ERR_STATE:            VSS 3GPP is not in an appropriate state for this function to
    553  *                                  be called
    554  * @return  M4VSS3GPP_WAR_EDITING_DONE:Edition is done, user should now call M4VSS3GPP_editClose()
    555  ******************************************************************************
    556  */
    557 M4OSA_ERR M4VSS3GPP_editStep(M4VSS3GPP_EditContext pContext, M4OSA_UInt8 *pProgress);
    558 
    559 /**
    560  ******************************************************************************
    561  * M4OSA_ERR M4VSS3GPP_editClose()
    562  * @brief   Finish the VSS 3GPP edit operation.
    563  * @note    The output 3GPP file is ready to be played after this call
    564  * @param   pContext            (IN) VSS 3GPP edit context
    565  * @return  M4NO_ERROR:         No error
    566  * @return  M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
    567  * @return  M4ERR_STATE:        VSS 3GPP is not in an appropriate state for this function
    568  *                              to be called
    569  ******************************************************************************
    570  */
    571 M4OSA_ERR M4VSS3GPP_editClose(M4VSS3GPP_EditContext pContext);
    572 
    573 /**
    574  ******************************************************************************
    575  * M4OSA_ERR M4VSS3GPP_editCleanUp()
    576  * @brief   Free all resources used by the VSS 3GPP edit operation.
    577  * @note    The context is no more valid after this call
    578  * @param   pContext            (IN) VSS 3GPP edit context
    579  * @return  M4NO_ERROR:         No error
    580  * @return  M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
    581  ******************************************************************************
    582  */
    583 M4OSA_ERR M4VSS3GPP_editCleanUp(M4VSS3GPP_EditContext pContext);
    584 
    585 /**
    586  ******************************************************************************
    587  ******************************************************************************
    588  ******************************************************************************
    589  *
    590  *      Audio Mixing Feature
    591  *
    592  ******************************************************************************
    593  ******************************************************************************
    594  ******************************************************************************
    595  */
    596 /**
    597  *  Public type of the VSS audio mixing context */
    598 typedef M4OSA_Void* M4VSS3GPP_AudioMixingContext;
    599 
    600 
    601 /**
    602  ******************************************************************************
    603  * struct   M4VSS3GPP_AudioMixingSettings
    604  * @brief   This structure defines the settings of the audio mixing operation.
    605  ******************************************************************************
    606  */
    607 typedef struct {
    608     M4OSA_Void*                             pOriginalClipFile;      /**< Input 3GPP clip file */
    609     M4OSA_Void*                             pAddedAudioTrackFile;   /**< New audio track */
    610     M4VIDEOEDITING_FileType                 AddedAudioFileType;     /**< File Format of the new audio file */
    611     M4OSA_UInt32                            uiAddCts;               /**< Time, in milliseconds,
    612                                                                     at which the added audio track is inserted */
    613     M4OSA_UInt32                            uiAddVolume;            /**< Volume, in percentage,
    614                                                                         of the added audio track */
    615     M4OSA_UInt32                            uiBeginLoop;            /**< Describes in milli-second the
    616                                                                         start time of the loop */
    617     M4OSA_UInt32                            uiEndLoop;              /**< Describes in milli-second the end
    618                                                                     time of the loop (0 means no loop) */
    619     M4OSA_Bool                              bRemoveOriginal;      /**< If true, the original audio track
    620                                                                      is not taken into account */
    621     M4OSA_Void*                             pOutputClipFile;      /**< Output 3GPP clip file */
    622     M4OSA_Void*                             pTemporaryFile;       /**< Temporary file to store metadata
    623                                                      ("moov.bin") */
    624     /**< The following parameters are optionnal. They are just used in case of MP3 replacement. */
    625     M4VIDEOEDITING_AudioSamplingFrequency   outputASF;         /**< Output sampling frequency */
    626     M4VIDEOEDITING_AudioFormat              outputAudioFormat; /**< Output audio codec(AAC/AMR)*/
    627     M4VIDEOEDITING_Bitrate                  outputAudioBitrate; /**< Output audio bitrate */
    628     M4OSA_UInt8                             outputNBChannels; /**< Output audio nb of channels */
    629     M4OSA_Bool                              b_DuckingNeedeed;
    630     M4OSA_Int32                             InDucking_threshold;
    631     M4OSA_Float                             fBTVolLevel;
    632     M4OSA_Float                             fPTVolLevel;
    633     M4OSA_Float                             InDucking_lowVolume;
    634     M4OSA_Bool                              bLoop;
    635     M4OSA_UInt32                            uiSamplingFrequency;
    636     M4OSA_UInt32                            uiNumChannels;
    637 } M4VSS3GPP_AudioMixingSettings;
    638 
    639 /**
    640  ******************************************************************************
    641  * M4OSA_ERR M4VSS3GPP_audioMixingInit(M4VSS3GPP_AudioMixingContext* pContext,
    642  *                                     M4VSS3GPP_AudioMixingSettings* pSettings)
    643  * @brief    Initializes the VSS audio mixing operation (allocates an execution context).
    644  * @note
    645  * @param    pContext        (OUT) Pointer on the VSS audio mixing context to allocate
    646  * @param    pSettings        (IN) Pointer to valid audio mixing settings
    647  * @param    pFileReadPtrFct        (IN) Pointer to OSAL file reader functions
    648  * @param   pFileWritePtrFct    (IN) Pointer to OSAL file writer functions
    649  * @return    M4NO_ERROR:            No error
    650  * @return    M4ERR_PARAMETER:    At least one parameter is M4OSA_NULL (debug only)
    651  * @return    M4ERR_ALLOC:        There is no more available memory
    652  ******************************************************************************
    653  */
    654 M4OSA_ERR M4VSS3GPP_audioMixingInit(
    655     M4VSS3GPP_AudioMixingContext* pContext,
    656     M4VSS3GPP_AudioMixingSettings* pSettings,
    657     M4OSA_FileReadPointer* pFileReadPtrFct,
    658     M4OSA_FileWriterPointer* pFileWritePtrFct );
    659 
    660 /**
    661  ******************************************************************************
    662  * M4OSA_ERR M4VSS3GPP_audioMixingStep()
    663  * @brief   Perform one step of audio mixing.
    664  * @note
    665  * @param   pContext                        (IN) VSS 3GPP audio mixing context
    666  * @return  M4NO_ERROR:                     No error
    667  * @return  M4ERR_PARAMETER:                pContext is M4OSA_NULL (debug only)
    668  * @param   pProgress                       (OUT) Progress percentage (0 to 100)
    669                                                   of the finalization operation
    670  * @return  M4ERR_STATE:                    VSS is not in an appropriate state for
    671                                             this function to be called
    672  * @return  M4VSS3GPP_WAR_END_OF_AUDIO_MIXING: Audio mixing is over, user should
    673                                                now call M4VSS3GPP_audioMixingCleanUp()
    674  ******************************************************************************
    675  */
    676 M4OSA_ERR M4VSS3GPP_audioMixingStep(M4VSS3GPP_AudioMixingContext pContext,
    677                                      M4OSA_UInt8 *pProgress);
    678 
    679 /**
    680  ******************************************************************************
    681  * M4OSA_ERR M4VSS3GPP_audioMixingCleanUp()
    682  * @brief   Free all resources used by the VSS audio mixing operation.
    683  * @note    The context is no more valid after this call
    684  * @param   pContext            (IN) VSS 3GPP audio mixing context
    685  * @return  M4NO_ERROR:         No error
    686  * @return  M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
    687  ******************************************************************************
    688  */
    689 M4OSA_ERR M4VSS3GPP_audioMixingCleanUp(M4VSS3GPP_AudioMixingContext pContext);
    690 
    691 
    692 /**
    693  ******************************************************************************
    694  ******************************************************************************
    695  ******************************************************************************
    696  *
    697  *      Extract Picture Feature
    698  *
    699  ******************************************************************************
    700  ******************************************************************************
    701  ******************************************************************************
    702  */
    703 /**
    704  *  Public type of the VSS extract picture context */
    705 typedef M4OSA_Void* M4VSS3GPP_ExtractPictureContext;
    706 
    707 /**
    708  ******************************************************************************
    709  * struct   M4VSS3GPP_ExtractPictureSettings
    710  * @brief   This structure defines the settings of the extract picture audio operation.
    711  ******************************************************************************
    712  */
    713 typedef struct {
    714     M4OSA_Void*                         pInputClipFile;  /**< Input 3GPP clip file */
    715     M4OSA_Int32                         iExtractionTime; /**< frame time (in ms) to be extracted */
    716     M4OSA_Void*                         pOutputYuvPic;   /**< Output YUV picture name */
    717 } M4VSS3GPP_ExtractPictureSettings;
    718 
    719 
    720 /******************************************************************************
    721  * M4OSA_ERR M4VSS3GPP_extractPictureInit()
    722  * @brief    Initializes the VSS extract picture operation (allocates an execution context).
    723  * @note
    724  * @param    pContext            (OUT) Pointer on the VSS extract picture context to allocate
    725  * @param    pSettings            (IN) Pointer to valid extract picture settings
    726  * @param    pWidth                (OUT) video stream width
    727  * @param    pHeight                (OUT) video stream height
    728  * @param    pFileReadPtrFct        (IN) Pointer to OSAL file reader functions
    729  * @return    M4NO_ERROR:                        No error
    730  * @return    M4ERR_PARAMETER:                At least one parameter is M4OSA_NULL (debug only)
    731  * @return    M4ERR_ALLOC:                    There is no more available memory
    732  * @return    M4VSS3GPP_ERR_INVALID_CLIP1:    The input clip is empty
    733  ******************************************************************************
    734  */
    735 M4OSA_ERR M4VSS3GPP_extractPictureInit(
    736         M4VSS3GPP_ExtractPictureContext* pContext,
    737         M4VSS3GPP_ExtractPictureSettings* pSettings,
    738         M4OSA_UInt32 *pWidth,
    739         M4OSA_UInt32 *pHeight,
    740         M4OSA_FileReadPointer* pFileReadPtrFct );
    741 
    742 /**
    743  ******************************************************************************
    744  * M4OSA_ERR M4VSS3GPP_extractPictureStep()
    745  * @brief   Perform one step of picture extraction.
    746  * @note
    747  * @param   pContext                        (IN) VSS extract picture context
    748  * @return  M4NO_ERROR:                     No error
    749  * @return  M4ERR_PARAMETER:                pContext is M4OSA_NULL (debug only)
    750  * @param   pDecPlanes                      (OUT) Plane in wich the extracted picture is copied
    751  * @param   pProgress                       (OUT) Progress percentage (0 to 100)
    752                                                  of the picture extraction
    753  * @return  M4ERR_STATE:                    VSS is not in an appropriate state for this
    754                                             function to be called
    755  * @return  VSS_WAR_END_OF_EXTRACT_PICTURE: Picture extraction  is over, user should now
    756                                             call M4VSS3GPP_extractPictureCleanUp()
    757  ******************************************************************************
    758  */
    759 M4OSA_ERR M4VSS3GPP_extractPictureStep(M4VSS3GPP_ExtractPictureContext pContext,
    760                                        M4VIFI_ImagePlane *pDecPlanes, M4OSA_UInt8 *pProgress);
    761 
    762 /**
    763  ******************************************************************************
    764  * M4OSA_ERR M4VSS3GPP_extractPictureCleanUp()
    765  * @brief   Free all resources used by the VSS picture extraction.
    766  * @note    The context is no more valid after this call
    767  * @param   pContext            (IN) VSS extract picture context
    768  * @return  M4NO_ERROR:         No error
    769  * @return  M4ERR_PARAMETER:    pContext is M4OSA_NULL (debug only)
    770  ******************************************************************************
    771  */
    772 M4OSA_ERR M4VSS3GPP_extractPictureCleanUp(M4VSS3GPP_ExtractPictureContext pContext);
    773 
    774 /**
    775  ******************************************************************************
    776  ******************************************************************************
    777  ******************************************************************************
    778  *
    779  *      Common features
    780  *
    781  ******************************************************************************
    782  ******************************************************************************
    783  ******************************************************************************
    784  */
    785 
    786 /**
    787  ******************************************************************************
    788  * M4OSA_ERR M4VSS3GPP_GetVersion()
    789  * @brief   Get the VSS version.
    790  * @note    Can be called anytime. Do not need any context.
    791  * @param   pVersionInfo        (OUT) Pointer to a version info structure
    792  * @return  M4NO_ERROR:         No error
    793  ******************************************************************************
    794  */
    795 M4OSA_ERR M4VSS3GPP_GetVersion(M4_VersionInfo* pVersionInfo);
    796 
    797 
    798 #ifdef WIN32
    799 /**
    800  ******************************************************************************
    801  * M4OSA_ERR M4VSS3GPP_GetErrorMessage()
    802  * @brief   Return a string describing the given error code
    803  * @note    The input string must be already allocated (and long enough!)
    804  * @param   err             (IN) Error code to get the description from
    805  * @param   sMessage        (IN/OUT) Allocated string in which the description will be copied
    806  * @return  M4NO_ERROR:     Input error is from the VSS3GPP module
    807  * @return  M4ERR_PARAMETER:Input error is not from the VSS3GPP module
    808  ******************************************************************************
    809  */
    810 M4OSA_ERR M4VSS3GPP_GetErrorMessage(M4OSA_ERR err, M4OSA_Char* sMessage);
    811 #endif /**< WIN32 */
    812 
    813 
    814 #ifdef __cplusplus
    815 }
    816 #endif /* __cplusplus */
    817 
    818 #endif /* __M4VSS3GPP_API_H__ */
    819 
    820