Home | History | Annotate | Download | only in src
      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  *************************************************************************
     18  * @file   M4VSS3GPP_Codecs.c
     19  * @brief  VSS implementation
     20  * @note   This file contains all functions related to audio/video
     21  *            codec manipulations.
     22  *************************************************************************
     23  */
     24 
     25 #include "NXPSW_CompilerSwitches.h"
     26 
     27 #include "M4OSA_Debug.h"             /**< Include for OSAL debug services */
     28 #include "M4VSS3GPP_ErrorCodes.h"
     29 #include "M4VSS3GPP_InternalTypes.h" /**< Internal types of the VSS */
     30 
     31 /**
     32  ************************************************************************
     33  * M4OSA_ERR   M4VSS3GPP_clearInterfaceTables()
     34  * @brief    Clear encoders, decoders, reader and writers interfaces tables
     35  * @param    pContext            (IN/OUT) VSS context.
     36  * @return    M4NO_ERROR:            No error
     37  * @return    M4ERR_PARAMETER:    The context is null
     38  ************************************************************************
     39  */
     40 M4OSA_ERR M4VSS3GPP_clearInterfaceTables( M4VSS3GPP_MediaAndCodecCtxt *pC )
     41 {
     42     M4OSA_UInt8 i;
     43 
     44     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
     45         "invalid context pointer");
     46 
     47     /* Initialisation that will allow to check if registering twice */
     48     pC->pWriterGlobalFcts = M4OSA_NULL;
     49     pC->pWriterDataFcts = M4OSA_NULL;
     50     pC->pVideoEncoderGlobalFcts = M4OSA_NULL;
     51     pC->pAudioEncoderGlobalFcts = M4OSA_NULL;
     52     pC->pCurrentAudioEncoderUserData = M4OSA_NULL;
     53     pC->pCurrentAudioDecoderUserData = M4OSA_NULL;
     54 
     55     pC->pCurrentVideoEncoderExternalAPI = M4OSA_NULL;
     56     pC->pCurrentVideoEncoderUserData = M4OSA_NULL;
     57 
     58     for ( i = 0; i < M4WRITER_kType_NB; i++ )
     59     {
     60         pC->WriterInterface[i].pGlobalFcts = M4OSA_NULL;
     61         pC->WriterInterface[i].pDataFcts = M4OSA_NULL;
     62     }
     63 
     64     for ( i = 0; i < M4ENCODER_kVideo_NB; i++ )
     65     {
     66         pC->pVideoEncoderInterface[i] = M4OSA_NULL;
     67         pC->pVideoEncoderExternalAPITable[i] = M4OSA_NULL;
     68         pC->pVideoEncoderUserDataTable[i] = M4OSA_NULL;
     69     }
     70 
     71     for ( i = 0; i < M4ENCODER_kAudio_NB; i++ )
     72     {
     73         pC->pAudioEncoderInterface[i] = M4OSA_NULL;
     74         pC->pAudioEncoderFlag[i] = M4OSA_FALSE;
     75         pC->pAudioEncoderUserDataTable[i] = M4OSA_NULL;
     76     }
     77 
     78     /* Initialisation that will allow to check if registering twice */
     79     pC->m_pReader = M4OSA_NULL;
     80     pC->m_pReaderDataIt = M4OSA_NULL;
     81     pC->m_uiNbRegisteredReaders = 0;
     82 
     83     for ( i = 0; i < M4READER_kMediaType_NB; i++ )
     84     {
     85         pC->m_pReaderGlobalItTable[i] = M4OSA_NULL;
     86         pC->m_pReaderDataItTable[i] = M4OSA_NULL;
     87     }
     88 
     89     pC->m_pVideoDecoder = M4OSA_NULL;
     90 #ifdef M4VSS_ENABLE_EXTERNAL_DECODERS
     91 
     92     pC->m_pCurrentVideoDecoderUserData = M4OSA_NULL;
     93 #endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */
     94 
     95     pC->m_uiNbRegisteredVideoDec = 0;
     96 
     97     for ( i = 0; i < M4DECODER_kVideoType_NB; i++ )
     98     {
     99         pC->m_pVideoDecoderItTable[i] = M4OSA_NULL;
    100 #ifdef M4VSS_ENABLE_EXTERNAL_DECODERS
    101 
    102         pC->m_pVideoDecoderUserDataTable[i] = M4OSA_NULL;
    103 
    104 #endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */
    105 
    106     }
    107 
    108     pC->m_pAudioDecoder = M4OSA_NULL;
    109 
    110     for ( i = 0; i < M4AD_kType_NB; i++ )
    111     {
    112         pC->m_pAudioDecoderItTable[i] = M4OSA_NULL;
    113         pC->m_pAudioDecoderFlagTable[i] = M4OSA_FALSE;
    114         pC->pAudioDecoderUserDataTable[i] = M4OSA_NULL;
    115     }
    116 
    117     return M4NO_ERROR;
    118 }
    119 
    120 /**
    121  ******************************************************************************
    122  * M4OSA_ERR   M4VSS3GPP_registerWriter()
    123  * @brief    This function will register a specific file format writer.
    124  * @note    According to the Mediatype, this function will store in the internal
    125  *        context the writer context.
    126  * @param    pContext:    (IN) Execution context.
    127  * @return    M4NO_ERROR: there is no error
    128  * @return    M4ERR_PARAMETER    pContext,pWtrGlobalInterface or pWtrDataInterface is M4OSA_NULL
    129  *                          (debug only), or invalid MediaType
    130  ******************************************************************************
    131  */
    132 M4OSA_ERR M4VSS3GPP_registerWriter( M4VSS3GPP_MediaAndCodecCtxt *pC,
    133                                    M4WRITER_OutputFileType MediaType,
    134                                    M4WRITER_GlobalInterface *pWtrGlobalInterface,
    135                                    M4WRITER_DataInterface *pWtrDataInterface )
    136 {
    137     /**
    138     *    Check input parameters */
    139     M4OSA_DEBUG_IF2((pC == M4OSA_NULL), M4ERR_PARAMETER,
    140         "VSS: context is M4OSA_NULL in M4VSS3GPP_registerWriter");
    141     M4OSA_DEBUG_IF2((pWtrGlobalInterface == M4OSA_NULL), M4ERR_PARAMETER,
    142         "pWtrGlobalInterface is M4OSA_NULL in M4VSS3GPP_registerWriter");
    143     M4OSA_DEBUG_IF2((pWtrDataInterface == M4OSA_NULL), M4ERR_PARAMETER,
    144         "pWtrDataInterface is M4OSA_NULL in M4VSS3GPP_registerWriter");
    145 
    146     M4OSA_TRACE3_3(
    147         "VSS: M4VSS3GPP_registerWriter called with pContext=0x%x, pWtrGlobalInterface=0x%x,\
    148         pWtrDataInterface=0x%x",
    149         pC, pWtrGlobalInterface, pWtrDataInterface);
    150 
    151     if( ( MediaType == M4WRITER_kUnknown) || (MediaType >= M4WRITER_kType_NB) )
    152     {
    153         M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER, "Invalid media type");
    154         return M4ERR_PARAMETER;
    155     }
    156 
    157     if( pC->WriterInterface[MediaType].pGlobalFcts != M4OSA_NULL )
    158     {
    159         /* a writer corresponding to this media type has already been registered !*/
    160         M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER,
    161             "This media type has already been registered");
    162         return M4ERR_PARAMETER;
    163     }
    164 
    165     /*
    166     * Save writer interface in context */
    167     pC->WriterInterface[MediaType].pGlobalFcts = pWtrGlobalInterface;
    168     pC->WriterInterface[MediaType].pDataFcts = pWtrDataInterface;
    169 
    170     return M4NO_ERROR;
    171 }
    172 
    173 /**
    174  ******************************************************************************
    175  * M4OSA_ERR   M4VSS3GPP_registerVideoEncoder()
    176  * @brief    This function will register a specific video encoder.
    177  * @note    According to the Mediatype, this function will store in the internal
    178  *        context the encoder context.
    179  * @param    pContext:    (IN) Execution context.
    180  * @return    M4NO_ERROR: there is no error
    181  * @return    M4ERR_PARAMETER    pContext or pEncGlobalInterface is M4OSA_NULL (debug only),
    182  *                          or invalid MediaType
    183  ******************************************************************************
    184  */
    185 M4OSA_ERR M4VSS3GPP_registerVideoEncoder( M4VSS3GPP_MediaAndCodecCtxt *pC,
    186                                          M4ENCODER_Format MediaType,
    187                                          M4ENCODER_GlobalInterface *pEncGlobalInterface )
    188 {
    189     /**
    190     *    Check input parameters */
    191     M4OSA_DEBUG_IF2((pC == M4OSA_NULL), M4ERR_PARAMETER,
    192         "VSS: context is M4OSA_NULL in M4VSS3GPP_registerVideoEncoder");
    193     M4OSA_DEBUG_IF2((pEncGlobalInterface == M4OSA_NULL), M4ERR_PARAMETER,
    194         "pEncGlobalInterface is M4OSA_NULL in M4VSS3GPP_registerVideoEncoder");
    195 
    196     M4OSA_TRACE3_3(
    197         "VSS: M4VSS3GPP_registerEncoder called with pContext=0x%x, pEncGlobalInterface=0x%x,\
    198         MediaType=0x%x",
    199         pC, pEncGlobalInterface, MediaType);
    200 
    201     if( MediaType >= M4ENCODER_kVideo_NB )
    202     {
    203         M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER,
    204             "Invalid video encoder type");
    205         return M4ERR_PARAMETER;
    206     }
    207 
    208     if( pC->pVideoEncoderInterface[MediaType] != M4OSA_NULL )
    209     {
    210         /* can be legitimate, in cases where we have one version that can use external encoders
    211         but which still has the built-in one to be able to work without an external encoder; in
    212         this case the new encoder simply replaces the old one (i.e. we unregister it first). */
    213 #ifdef M4VSS_SUPPORT_OMX_CODECS
    214 
    215         if( M4OSA_TRUE == pC->bAllowFreeingOMXCodecInterface )
    216         {
    217 
    218 #endif
    219 
    220             free(pC->pVideoEncoderInterface[MediaType]);
    221 #ifdef M4VSS_SUPPORT_OMX_CODECS
    222 
    223         }
    224 
    225 #endif
    226 
    227         pC->pVideoEncoderInterface[MediaType] = M4OSA_NULL;
    228     }
    229 
    230     /*
    231     * Save encoder interface in context */
    232     pC->pVideoEncoderInterface[MediaType] = pEncGlobalInterface;
    233     /* The actual userData and external API will be set by the registration function in the case
    234     of an external encoder (add it as a parameter to this function in the long run?) */
    235     pC->pVideoEncoderUserDataTable[MediaType] = M4OSA_NULL;
    236     pC->pVideoEncoderExternalAPITable[MediaType] = M4OSA_NULL;
    237 
    238     return M4NO_ERROR;
    239 }
    240 
    241 /**
    242  ******************************************************************************
    243  * M4OSA_ERR   M4VSS3GPP_registerAudioEncoder()
    244  * @brief    This function will register a specific audio encoder.
    245  * @note    According to the Mediatype, this function will store in the internal
    246  *        context the encoder context.
    247  * @param    pContext:                (IN) Execution context.
    248  * @param    mediaType:                (IN) The media type.
    249  * @param    pEncGlobalInterface:    (OUT) the encoder interface functions.
    250  * @return    M4NO_ERROR: there is no error
    251  * @return    M4ERR_PARAMETER: pContext or pEncGlobalInterface is M4OSA_NULL (debug only)
    252  ******************************************************************************
    253  */
    254 M4OSA_ERR M4VSS3GPP_registerAudioEncoder( M4VSS3GPP_MediaAndCodecCtxt *pC,
    255                                          M4ENCODER_AudioFormat MediaType,
    256                                          M4ENCODER_AudioGlobalInterface *pEncGlobalInterface )
    257 {
    258     /**
    259     *    Check input parameters */
    260     M4OSA_DEBUG_IF2((pC == M4OSA_NULL), M4ERR_PARAMETER,
    261         "VSS: context is M4OSA_NULL in M4VSS3GPP_registerAudioEncoder");
    262     M4OSA_DEBUG_IF2((pEncGlobalInterface == M4OSA_NULL), M4ERR_PARAMETER,
    263         "pEncGlobalInterface is M4OSA_NULL in M4VSS3GPP_registerAudioEncoder");
    264 
    265     M4OSA_TRACE3_3(
    266         "VSS: M4VSS3GPP_registerAudioEncoder called pContext=0x%x, pEncGlobalInterface=0x%x,\
    267         MediaType=0x%x",
    268         pC, pEncGlobalInterface, MediaType);
    269 
    270     if( MediaType >= M4ENCODER_kAudio_NB )
    271     {
    272         M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER,
    273             "Invalid audio encoder type");
    274         return M4ERR_PARAMETER;
    275     }
    276 
    277     if( pC->pAudioEncoderInterface[MediaType] != M4OSA_NULL )
    278     {
    279         free(pC->pAudioEncoderInterface[MediaType]);
    280         pC->pAudioEncoderInterface[MediaType] = M4OSA_NULL;
    281     }
    282     /*
    283     * Save encoder interface in context */
    284     pC->pAudioEncoderInterface[MediaType] = pEncGlobalInterface;
    285     pC->pAudioEncoderFlag[MediaType] = M4OSA_FALSE; /* internal encoder */
    286     pC->pAudioEncoderUserDataTable[MediaType] = M4OSA_NULL;
    287 
    288     M4OSA_TRACE3_2(
    289         "M4VSS3GPP_registerAudioEncoder: pC->pAudioEncoderInterface[0x%x] = 0x%x",
    290         MediaType, pC->pAudioEncoderInterface[MediaType]);
    291 
    292     return M4NO_ERROR;
    293 }
    294 
    295 /**
    296  ************************************************************************
    297  * M4OSA_ERR   M4VSS3GPP_registerReader()
    298  * @brief    Register reader.
    299  * @param    pContext            (IN/OUT) VSS context.
    300  * @return    M4NO_ERROR:            No error
    301  * @return    M4ERR_PARAMETER:    A parameter is null (in DEBUG only)
    302  ************************************************************************
    303  */
    304 M4OSA_ERR M4VSS3GPP_registerReader( M4VSS3GPP_MediaAndCodecCtxt *pC,
    305                                    M4READER_MediaType mediaType,
    306                                    M4READER_GlobalInterface *pRdrGlobalInterface,
    307                                    M4READER_DataInterface *pRdrDataInterface )
    308 {
    309     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
    310         "invalid context pointer");
    311     M4OSA_DEBUG_IF1((M4OSA_NULL == pRdrGlobalInterface), M4ERR_PARAMETER,
    312         "M4VSS3GPP_registerReader: invalid pointer on global interface");
    313     M4OSA_DEBUG_IF1((M4OSA_NULL == pRdrDataInterface), M4ERR_PARAMETER,
    314         "M4VSS3GPP_registerReader: invalid pointer on data interface");
    315 
    316     if( mediaType == M4READER_kMediaTypeUnknown
    317         || mediaType >= M4READER_kMediaType_NB )
    318     {
    319         M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER, "Invalid media type");
    320         return M4ERR_PARAMETER;
    321     }
    322 
    323     if( pC->m_pReaderGlobalItTable[mediaType] != M4OSA_NULL )
    324     {
    325         /* a reader corresponding to this media type has already been registered !*/
    326         M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER,
    327             "This media type has already been registered");
    328         return M4ERR_PARAMETER;
    329     }
    330 
    331     pC->m_pReaderGlobalItTable[mediaType] = pRdrGlobalInterface;
    332     pC->m_pReaderDataItTable[mediaType] = pRdrDataInterface;
    333 
    334     pC->m_uiNbRegisteredReaders++;
    335 
    336     return M4NO_ERROR;
    337 }
    338 
    339 /**
    340  ************************************************************************
    341  * M4OSA_ERR   M4VSS3GPP_registerVideoDecoder()
    342  * @brief    Register video decoder
    343  * @param    pContext                (IN/OUT) VSS context.
    344  * @param    decoderType            (IN) Decoder type
    345  * @param    pDecoderInterface    (IN) Decoder interface.
    346  * @return    M4NO_ERROR:            No error
    347  * @return    M4ERR_PARAMETER:    A parameter is null (in DEBUG only),
    348  *                                or the decoder type is invalid
    349  ************************************************************************
    350  */
    351 M4OSA_ERR M4VSS3GPP_registerVideoDecoder( M4VSS3GPP_MediaAndCodecCtxt *pC,
    352                                          M4DECODER_VideoType decoderType,
    353                                          M4DECODER_VideoInterface *pDecoderInterface )
    354 {
    355     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
    356         "invalid context pointer");
    357     M4OSA_DEBUG_IF1((M4OSA_NULL == pDecoderInterface), M4ERR_PARAMETER,
    358         "M4VSS3GPP_registerVideoDecoder: invalid pointer on decoder interface");
    359 
    360     if( decoderType >= M4DECODER_kVideoType_NB )
    361     {
    362         M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER,
    363             "Invalid video decoder type");
    364         return M4ERR_PARAMETER;
    365     }
    366 
    367     if( pC->m_pVideoDecoderItTable[decoderType] != M4OSA_NULL )
    368     {
    369 #ifndef M4VSS_ENABLE_EXTERNAL_DECODERS
    370         /* a decoder corresponding to this media type has already been registered !*/
    371 
    372         M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER,
    373             "Decoder has already been registered");
    374         return M4ERR_PARAMETER;
    375 
    376 #else /* external decoders are possible */
    377         /* can be legitimate, in cases where we have one version that can use external decoders
    378         but which still has the built-in one to be able to work without an external decoder; in
    379         this case the new decoder simply replaces the old one (i.e. we unregister it first). */
    380 #ifdef M4VSS_SUPPORT_OMX_CODECS
    381 
    382         if( M4OSA_TRUE == pC->bAllowFreeingOMXCodecInterface )
    383         {
    384 
    385 #endif
    386 
    387             free(pC->m_pVideoDecoderItTable[decoderType]);
    388 #ifdef M4VSS_SUPPORT_OMX_CODECS
    389 
    390         }
    391 
    392 #endif
    393 
    394         pC->m_pVideoDecoderItTable[decoderType] = M4OSA_NULL;
    395         /* oh, and don't forget the user data, too. */
    396         if( pC->m_pVideoDecoderUserDataTable[decoderType] != M4OSA_NULL )
    397         {
    398             free(pC->m_pVideoDecoderUserDataTable[decoderType]);
    399             pC->m_pVideoDecoderUserDataTable[decoderType] = M4OSA_NULL;
    400         }
    401 #endif /* are external decoders possible? */
    402 
    403     }
    404 
    405     pC->m_pVideoDecoderItTable[decoderType] = pDecoderInterface;
    406 #ifdef M4VSS_ENABLE_EXTERNAL_DECODERS
    407 
    408     pC->m_pVideoDecoderUserDataTable[decoderType] = M4OSA_NULL;
    409     /* The actual userData will be set by the registration function in the case
    410     of an external decoder (add it as a parameter to this function in the long run?) */
    411 
    412 #endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */
    413 
    414     pC->m_uiNbRegisteredVideoDec++;
    415 
    416     return M4NO_ERROR;
    417 }
    418 
    419 /**
    420  ************************************************************************
    421  * M4OSA_ERR   M4VSS3GPP_registerAudioDecoder()
    422  * @brief    Register audio decoder
    423  * @note    This function is used internaly by the VSS to register NXP audio decoders,
    424  * @param    context                (IN/OUT) VSS context.
    425  * @param    decoderType            (IN) Audio decoder type
    426  * @param    pDecoderInterface    (IN) Audio decoder interface.
    427  * @return    M4NO_ERROR:            No error
    428  * @return    M4ERR_PARAMETER:   A parameter is null, or the decoder type is invalid(in DEBUG only)
    429  ************************************************************************
    430  */
    431 M4OSA_ERR M4VSS3GPP_registerAudioDecoder( M4VSS3GPP_MediaAndCodecCtxt *pC,
    432                                          M4AD_Type decoderType, M4AD_Interface *pDecoderInterface)
    433 {
    434     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
    435         "invalid context pointer");
    436     M4OSA_DEBUG_IF1((M4OSA_NULL == pDecoderInterface), M4ERR_PARAMETER,
    437         "M4VSS3GPP_registerAudioDecoder: invalid pointer on decoder interface");
    438 
    439     if( decoderType >= M4AD_kType_NB )
    440     {
    441         M4OSA_DEBUG_IF1(M4OSA_TRUE, M4ERR_PARAMETER,
    442             "Invalid audio decoder type");
    443         return M4ERR_PARAMETER;
    444     }
    445     if(M4OSA_NULL != pC->m_pAudioDecoderItTable[decoderType])
    446     {
    447         free(pC->m_pAudioDecoderItTable[decoderType]);
    448         pC->m_pAudioDecoderItTable[decoderType] = M4OSA_NULL;
    449 
    450         if(M4OSA_NULL != pC->m_pAudioDecoderItTable[decoderType])
    451         {
    452             free(pC->m_pAudioDecoderItTable[decoderType]);
    453             pC->m_pAudioDecoderItTable[decoderType] = M4OSA_NULL;
    454         }
    455     }
    456 
    457 
    458 
    459     pC->m_pAudioDecoderItTable[decoderType] = pDecoderInterface;
    460     pC->m_pAudioDecoderFlagTable[decoderType] =
    461         M4OSA_FALSE; /* internal decoder */
    462     pC->pAudioDecoderUserDataTable[decoderType] = M4OSA_NULL;
    463 
    464     return M4NO_ERROR;
    465 }
    466 
    467 /**
    468  ************************************************************************
    469  * M4OSA_ERR   M4VSS3GPP_unRegisterAllWriters()
    470  * @brief    Unregister writer
    471  * @param    pContext            (IN/OUT) VSS context.
    472  * @return    M4NO_ERROR:            No error
    473  * @return    M4ERR_PARAMETER:    A parameter is null (in DEBUG only)
    474  ************************************************************************
    475  */
    476 M4OSA_ERR M4VSS3GPP_unRegisterAllWriters( M4VSS3GPP_MediaAndCodecCtxt *pC )
    477 {
    478     M4OSA_Int32 i;
    479 
    480     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
    481         "invalid context pointer");
    482 
    483     for ( i = 0; i < M4WRITER_kType_NB; i++ )
    484     {
    485         if( pC->WriterInterface[i].pGlobalFcts != M4OSA_NULL )
    486         {
    487             free(pC->WriterInterface[i].pGlobalFcts);
    488             pC->WriterInterface[i].pGlobalFcts = M4OSA_NULL;
    489         }
    490 
    491         if( pC->WriterInterface[i].pDataFcts != M4OSA_NULL )
    492         {
    493             free(pC->WriterInterface[i].pDataFcts);
    494             pC->WriterInterface[i].pDataFcts = M4OSA_NULL;
    495         }
    496     }
    497 
    498     pC->pWriterGlobalFcts = M4OSA_NULL;
    499     pC->pWriterDataFcts = M4OSA_NULL;
    500 
    501     return M4NO_ERROR;
    502 }
    503 
    504 /**
    505  ************************************************************************
    506  * M4OSA_ERR   M4VSS3GPP_unRegisterAllEncoders()
    507  * @brief    Unregister the encoders
    508  * @param    pContext            (IN/OUT) VSS context.
    509  * @return    M4NO_ERROR:            No error
    510  * @return    M4ERR_PARAMETER:    A parameter is null (in DEBUG only)
    511  ************************************************************************
    512  */
    513 M4OSA_ERR M4VSS3GPP_unRegisterAllEncoders( M4VSS3GPP_MediaAndCodecCtxt *pC )
    514 {
    515     M4OSA_Int32 i;
    516 
    517     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
    518         "invalid context pointer");
    519     M4OSA_TRACE3_1("M4VSS3GPP_unRegisterAllEncoders: pC=0x%x", pC);
    520 
    521     for ( i = 0; i < M4ENCODER_kVideo_NB; i++ )
    522     {
    523         if( pC->pVideoEncoderInterface[i] != M4OSA_NULL )
    524         {
    525 #ifdef M4VSS_SUPPORT_OMX_CODECS
    526 
    527             if( M4OSA_TRUE == pC->bAllowFreeingOMXCodecInterface )
    528             {
    529 
    530 #endif
    531 
    532                 free(pC->pVideoEncoderInterface[i]);
    533 #ifdef M4VSS_SUPPORT_OMX_CODECS
    534 
    535             }
    536 
    537 #endif
    538 
    539             pC->pVideoEncoderInterface[i] = M4OSA_NULL;
    540         }
    541     }
    542 
    543     for ( i = 0; i < M4ENCODER_kAudio_NB; i++ )
    544     {
    545         if( pC->pAudioEncoderInterface[i] != M4OSA_NULL )
    546         {
    547 #ifdef M4VSS_SUPPORT_OMX_CODECS
    548 
    549             if( M4OSA_TRUE == pC->bAllowFreeingOMXCodecInterface )
    550             {
    551 
    552 #endif
    553                 /*Don't free external audio encoders interfaces*/
    554 
    555                 if( M4OSA_FALSE == pC->pAudioEncoderFlag[i] )
    556                 {
    557                     free(pC->pAudioEncoderInterface[i]);
    558                 }
    559 #ifdef M4VSS_SUPPORT_OMX_CODECS
    560 
    561             }
    562 
    563 #endif
    564 
    565             pC->pAudioEncoderInterface[i] = M4OSA_NULL;
    566         }
    567     }
    568 
    569     pC->pVideoEncoderGlobalFcts = M4OSA_NULL;
    570     pC->pAudioEncoderGlobalFcts = M4OSA_NULL;
    571 
    572     return M4NO_ERROR;
    573 }
    574 
    575 /**
    576  ************************************************************************
    577  * M4OSA_ERR   M4VSS3GPP_unRegisterAllReaders()
    578  * @brief    Unregister reader
    579  * @param    pContext            (IN/OUT) VSS context.
    580  * @return    M4NO_ERROR:            No error
    581  * @return    M4ERR_PARAMETER:    A parameter is null (in DEBUG only)
    582  ************************************************************************
    583  */
    584 M4OSA_ERR M4VSS3GPP_unRegisterAllReaders( M4VSS3GPP_MediaAndCodecCtxt *pC )
    585 {
    586     M4OSA_Int32 i;
    587 
    588     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
    589         "invalid context pointer");
    590 
    591     for ( i = 0; i < M4READER_kMediaType_NB; i++ )
    592     {
    593         if( pC->m_pReaderGlobalItTable[i] != M4OSA_NULL )
    594         {
    595             free(pC->m_pReaderGlobalItTable[i]);
    596             pC->m_pReaderGlobalItTable[i] = M4OSA_NULL;
    597         }
    598 
    599         if( pC->m_pReaderDataItTable[i] != M4OSA_NULL )
    600         {
    601             free(pC->m_pReaderDataItTable[i]);
    602             pC->m_pReaderDataItTable[i] = M4OSA_NULL;
    603         }
    604     }
    605 
    606     pC->m_uiNbRegisteredReaders = 0;
    607     pC->m_pReader = M4OSA_NULL;
    608     pC->m_pReaderDataIt = M4OSA_NULL;
    609 
    610     return M4NO_ERROR;
    611 }
    612 
    613 /**
    614  ************************************************************************
    615  * M4OSA_ERR   M4VSS3GPP_unRegisterAllDecoders()
    616  * @brief    Unregister the decoders
    617  * @param    pContext            (IN/OUT) VSS context.
    618  * @return    M4NO_ERROR:            No error
    619  * @return    M4ERR_PARAMETER:    A parameter is null (in DEBUG only)
    620  ************************************************************************
    621  */
    622 M4OSA_ERR M4VSS3GPP_unRegisterAllDecoders( M4VSS3GPP_MediaAndCodecCtxt *pC )
    623 {
    624     M4OSA_Int32 i;
    625 
    626     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
    627         "invalid context pointer");
    628     M4OSA_TRACE3_1("M4VSS3GPP_unRegisterAllDecoders: pC=0x%x", pC);
    629 
    630     for ( i = 0; i < M4DECODER_kVideoType_NB; i++ )
    631     {
    632         if( pC->m_pVideoDecoderItTable[i] != M4OSA_NULL )
    633         {
    634 #ifdef M4VSS_SUPPORT_OMX_CODECS
    635 
    636             if( M4OSA_TRUE == pC->bAllowFreeingOMXCodecInterface )
    637             {
    638 
    639 #endif
    640 
    641                 free(pC->m_pVideoDecoderItTable[i]);
    642 #ifdef M4VSS_SUPPORT_OMX_CODECS
    643 
    644             }
    645 
    646 #endif
    647 
    648             pC->m_pVideoDecoderItTable[i] = M4OSA_NULL;
    649 
    650         }
    651     }
    652 
    653     for ( i = 0; i < M4AD_kType_NB; i++ )
    654     {
    655         if( pC->m_pAudioDecoderItTable[i] != M4OSA_NULL )
    656         {
    657 #ifdef M4VSS_SUPPORT_OMX_CODECS
    658 
    659             if( M4OSA_TRUE == pC->bAllowFreeingOMXCodecInterface )
    660             {
    661 
    662 #endif
    663                 /*Don't free external audio decoders interfaces*/
    664 
    665                 if( M4OSA_FALSE == pC->m_pAudioDecoderFlagTable[i] )
    666                 {
    667                     free(pC->m_pAudioDecoderItTable[i]);
    668                 }
    669 #ifdef M4VSS_SUPPORT_OMX_CODECS
    670 
    671             }
    672 
    673 #endif
    674 
    675             pC->m_pAudioDecoderItTable[i] = M4OSA_NULL;
    676         }
    677     }
    678 
    679     pC->m_uiNbRegisteredVideoDec = 0;
    680     pC->m_pVideoDecoder = M4OSA_NULL;
    681 
    682     pC->m_pAudioDecoder = M4OSA_NULL;
    683 
    684     return M4NO_ERROR;
    685 }
    686 
    687 /**
    688  ************************************************************************
    689  * M4OSA_ERR   M4VSS3GPP_setCurrentWriter()
    690  * @brief    Set current writer
    691  * @param    pContext            (IN/OUT) VSS context.
    692  * @param    mediaType            (IN) Media type.
    693  * @return    M4NO_ERROR:            No error
    694  * @return    M4ERR_PARAMETER:                    A parameter is null (in DEBUG only)
    695  * @return    M4WAR_VSS_MEDIATYPE_NOT_SUPPORTED:    Media type not supported
    696  ************************************************************************
    697  */
    698 M4OSA_ERR M4VSS3GPP_setCurrentWriter( M4VSS3GPP_MediaAndCodecCtxt *pC,
    699                                      M4VIDEOEDITING_FileType mediaType )
    700 {
    701     M4WRITER_OutputFileType writerType;
    702 
    703     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
    704         "invalid context pointer");
    705 
    706     switch( mediaType )
    707     {
    708         case M4VIDEOEDITING_kFileType_3GPP:
    709             writerType = M4WRITER_k3GPP;
    710             break;
    711         default:
    712             M4OSA_DEBUG_IF1(M4OSA_TRUE, M4VSS3GPP_ERR_INVALID_FILE_TYPE,
    713                 "Writer type not supported");
    714             return M4VSS3GPP_ERR_INVALID_FILE_TYPE;
    715     }
    716 
    717     pC->pWriterGlobalFcts = pC->WriterInterface[writerType].pGlobalFcts;
    718     pC->pWriterDataFcts = pC->WriterInterface[writerType].pDataFcts;
    719 
    720     if( pC->pWriterGlobalFcts == M4OSA_NULL
    721         || pC->pWriterDataFcts == M4OSA_NULL )
    722     {
    723         M4OSA_DEBUG_IF1(M4OSA_TRUE, M4VSS3GPP_ERR_INVALID_FILE_TYPE,
    724             "Writer type not supported");
    725         M4OSA_TRACE1_0("Writer type not supported");
    726         return M4VSS3GPP_ERR_INVALID_FILE_TYPE;
    727     }
    728 
    729     pC->pWriterDataFcts->pWriterContext = M4OSA_NULL;
    730 
    731     return M4NO_ERROR;
    732 }
    733 
    734 /**
    735  ************************************************************************
    736  * M4OSA_ERR   M4VSS3GPP_setCurrentVideoEncoder()
    737  * @brief    Set a video encoder
    738  * @param    pContext            (IN/OUT) VSS context.
    739  * @param    MediaType           (IN) Encoder type
    740  * @return    M4NO_ERROR:            No error
    741  * @return    M4ERR_PARAMETER:                    A parameter is null (in DEBUG only)
    742  * @return    M4WAR_VSS_MEDIATYPE_NOT_SUPPORTED:    Media type not supported
    743  ************************************************************************
    744  */
    745 M4OSA_ERR M4VSS3GPP_setCurrentVideoEncoder( M4VSS3GPP_MediaAndCodecCtxt *pC,
    746                                            M4SYS_StreamType mediaType )
    747 {
    748     M4ENCODER_Format encoderType;
    749 
    750     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
    751         "invalid context pointer");
    752     M4OSA_TRACE3_2("M4VSS3GPP_setCurrentVideoEncoder: pC=0x%x, mediaType=0x%x",
    753         pC, mediaType);
    754 
    755     switch( mediaType )
    756     {
    757         case M4SYS_kH263:
    758             encoderType = M4ENCODER_kH263;
    759             break;
    760 
    761         case M4SYS_kMPEG_4:
    762             encoderType = M4ENCODER_kMPEG4;
    763             break;
    764 
    765         case M4SYS_kH264:
    766             encoderType = M4ENCODER_kH264;
    767             break;
    768 
    769         default:
    770             M4OSA_DEBUG_IF1(M4OSA_TRUE,
    771                 M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT,
    772                 "Video encoder type not supported");
    773             return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT;
    774     }
    775 
    776     pC->pVideoEncoderGlobalFcts = pC->pVideoEncoderInterface[encoderType];
    777     pC->pCurrentVideoEncoderExternalAPI =
    778         pC->pVideoEncoderExternalAPITable[encoderType];
    779     pC->pCurrentVideoEncoderUserData =
    780         pC->pVideoEncoderUserDataTable[encoderType];
    781 
    782     if( pC->pVideoEncoderGlobalFcts == M4OSA_NULL )
    783     {
    784         M4OSA_DEBUG_IF1(M4OSA_TRUE,
    785             M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT,
    786             "Video encoder type not supported");
    787         M4OSA_TRACE1_0("Video encoder type not supported");
    788         return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_VIDEO_FORMAT;
    789     }
    790 
    791     return M4NO_ERROR;
    792 }
    793 
    794 /**
    795  ************************************************************************
    796  * M4OSA_ERR   M4VSS3GPP_setCurrentAudioEncoder()
    797  * @brief    Set an audio encoder
    798  * @param    context            (IN/OUT) VSS context.
    799  * @param    MediaType        (IN) Encoder type
    800  * @return    M4NO_ERROR:            No error
    801  * @return    M4ERR_PARAMETER:    A parameter is null (in DEBUG only)
    802  ************************************************************************
    803  */
    804 M4OSA_ERR M4VSS3GPP_setCurrentAudioEncoder( M4VSS3GPP_MediaAndCodecCtxt *pC,
    805                                            M4SYS_StreamType mediaType )
    806 {
    807     M4ENCODER_AudioFormat encoderType;
    808 
    809     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
    810         "invalid context pointer");
    811     M4OSA_TRACE3_2("M4VSS3GPP_setCurrentAudioEncoder: pC=0x%x, mediaType=0x%x",
    812         pC, mediaType);
    813 
    814     switch( mediaType )
    815     {
    816         case M4SYS_kAMR:
    817             M4OSA_TRACE3_0(
    818                 "M4VSS3GPP_setCurrentAudioEncoder: encoder type AMR");
    819             encoderType = M4ENCODER_kAMRNB;
    820             break;
    821 
    822         case M4SYS_kAAC:
    823             M4OSA_TRACE3_0(
    824                 "M4VSS3GPP_setCurrentAudioEncoder: encoder type AAC");
    825             encoderType = M4ENCODER_kAAC;
    826             break;
    827 
    828        default:
    829             M4OSA_DEBUG_IF1(M4OSA_TRUE,
    830                 M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT,
    831                 "Audio encoder type not supported");
    832             return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT;
    833     }
    834 
    835     pC->pAudioEncoderGlobalFcts = pC->pAudioEncoderInterface[encoderType];
    836     pC->pCurrentAudioEncoderUserData =
    837         pC->pAudioEncoderUserDataTable[encoderType];
    838 
    839     M4OSA_TRACE3_3(
    840         "M4VSS3GPP_setCurrentAudioEncoder: pC->pAudioEncoderInterface[0x%x]=0x%x,\
    841         pC->pAudioEncoderGlobalFcts = 0x%x",
    842         encoderType, pC->pAudioEncoderInterface[encoderType],
    843         pC->pAudioEncoderGlobalFcts);
    844 
    845     if( pC->pAudioEncoderGlobalFcts == M4OSA_NULL )
    846     {
    847         M4OSA_DEBUG_IF1(M4OSA_TRUE,
    848             M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT,
    849             "Audio encoder type not supported");
    850         M4OSA_TRACE1_0("Audio encoder type not supported");
    851         return M4VSS3GPP_ERR_EDITING_UNSUPPORTED_AUDIO_FORMAT;
    852     }
    853 
    854     return M4NO_ERROR;
    855 }
    856 
    857 /**
    858  ************************************************************************
    859  * M4OSA_ERR   M4VSS3GPP_setCurrentReader()
    860  * @brief    Set current reader
    861  * @param    pContext            (IN/OUT) VSS context.
    862  * @param    mediaType            (IN) Media type.
    863  * @return    M4NO_ERROR:            No error
    864  * @return    M4ERR_PARAMETER:                    A parameter is null (in DEBUG only)
    865  * @return    M4WAR_VSS_MEDIATYPE_NOT_SUPPORTED:    Media type not supported
    866  ************************************************************************
    867  */
    868 M4OSA_ERR M4VSS3GPP_setCurrentReader( M4VSS3GPP_MediaAndCodecCtxt *pC,
    869                                      M4VIDEOEDITING_FileType mediaType )
    870 {
    871     M4READER_MediaType readerType;
    872 
    873     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
    874         "invalid context pointer");
    875 
    876     switch( mediaType )
    877     {
    878         case M4VIDEOEDITING_kFileType_3GPP:
    879         case M4VIDEOEDITING_kFileType_MP4:
    880         case M4VIDEOEDITING_kFileType_M4V:
    881             readerType = M4READER_kMediaType3GPP;
    882             break;
    883 
    884         case M4VIDEOEDITING_kFileType_AMR:
    885             readerType = M4READER_kMediaTypeAMR;
    886             break;
    887 
    888         case M4VIDEOEDITING_kFileType_MP3:
    889             readerType = M4READER_kMediaTypeMP3;
    890             break;
    891 
    892         case M4VIDEOEDITING_kFileType_PCM:
    893             readerType = M4READER_kMediaTypePCM;
    894             break;
    895 
    896         default:
    897             M4OSA_DEBUG_IF1(M4OSA_TRUE, M4VSS3GPP_ERR_INVALID_FILE_TYPE,
    898                 "Reader type not supported");
    899             return M4VSS3GPP_ERR_INVALID_FILE_TYPE;
    900     }
    901 
    902     pC->m_pReader = pC->m_pReaderGlobalItTable[readerType];
    903     pC->m_pReaderDataIt = pC->m_pReaderDataItTable[readerType];
    904 
    905     if( pC->m_pReader == M4OSA_NULL || pC->m_pReaderDataIt == M4OSA_NULL )
    906     {
    907         M4OSA_DEBUG_IF1(M4OSA_TRUE, M4VSS3GPP_ERR_INVALID_FILE_TYPE,
    908             "Reader type not supported");
    909         M4OSA_TRACE1_0("Reader type not supported");
    910         return M4VSS3GPP_ERR_INVALID_FILE_TYPE;
    911     }
    912     return M4NO_ERROR;
    913 }
    914 
    915 /**
    916  ************************************************************************
    917  * M4OSA_ERR   M4VSS3GPP_setCurrentVideoDecoder()
    918  * @brief    Set a video decoder
    919  * @param    pContext            (IN/OUT) VSS context.
    920  * @param    decoderType        (IN) Decoder type
    921  * @return    M4NO_ERROR:            No error
    922  * @return    M4ERR_PARAMETER:                    A parameter is null (in DEBUG only)
    923  * @return    M4WAR_VSS_MEDIATYPE_NOT_SUPPORTED:    Media type not supported
    924  ************************************************************************
    925  */
    926 M4OSA_ERR M4VSS3GPP_setCurrentVideoDecoder( M4VSS3GPP_MediaAndCodecCtxt *pC,
    927                                            M4_StreamType mediaType )
    928 {
    929     M4DECODER_VideoType decoderType;
    930 
    931     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
    932         "invalid context pointer");
    933     M4OSA_TRACE3_2("M4VSS3GPP_setCurrentVideoDecoder: pC=0x%x, mediaType=0x%x",
    934         pC, mediaType);
    935 
    936     switch( mediaType )
    937     {
    938         case M4DA_StreamTypeVideoMpeg4:
    939         case M4DA_StreamTypeVideoH263:
    940             decoderType = M4DECODER_kVideoTypeMPEG4;
    941             break;
    942 
    943         case M4DA_StreamTypeVideoMpeg4Avc:
    944             decoderType = M4DECODER_kVideoTypeAVC;
    945             break;
    946         case M4DA_StreamTypeVideoARGB8888:
    947             decoderType = M4DECODER_kVideoTypeYUV420P;
    948             break;
    949         default:
    950             M4OSA_DEBUG_IF1(M4OSA_TRUE,
    951                 M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT,
    952                 "Video decoder type not supported");
    953             return M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT;
    954     }
    955 
    956     pC->m_pVideoDecoder = pC->m_pVideoDecoderItTable[decoderType];
    957 #ifdef M4VSS_ENABLE_EXTERNAL_DECODERS
    958 
    959     pC->m_pCurrentVideoDecoderUserData =
    960         pC->m_pVideoDecoderUserDataTable[decoderType];
    961 
    962 #endif /* M4VSS_ENABLE_EXTERNAL_DECODERS */
    963 
    964     if( pC->m_pVideoDecoder == M4OSA_NULL )
    965     {
    966         M4OSA_DEBUG_IF1(M4OSA_TRUE,
    967             M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT,
    968             "Video decoder type not supported");
    969         M4OSA_TRACE1_0("Video decoder type not supported");
    970         return M4VSS3GPP_ERR_UNSUPPORTED_INPUT_VIDEO_FORMAT;
    971     }
    972 
    973     return M4NO_ERROR;
    974 }
    975 
    976 /**
    977  ************************************************************************
    978  * M4OSA_ERR   M4VSS3GPP_setCurrentAudioDecoder()
    979  * @brief    Set an audio decoder
    980  * @param    context            (IN/OUT) VSS context.
    981  * @param    decoderType        (IN) Decoder type
    982  * @return    M4NO_ERROR:            No error
    983  * @return    M4ERR_PARAMETER:    A parameter is null (in DEBUG only)
    984  ************************************************************************
    985  */
    986 M4OSA_ERR M4VSS3GPP_setCurrentAudioDecoder( M4VSS3GPP_MediaAndCodecCtxt *pC,
    987                                            M4_StreamType mediaType )
    988 {
    989     M4AD_Type decoderType;
    990 
    991     M4OSA_DEBUG_IF1((M4OSA_NULL == pC), M4ERR_PARAMETER,
    992         "invalid context pointer");
    993     M4OSA_TRACE3_2("M4VSS3GPP_setCurrentAudioDecoder: pC=0x%x, mediaType=0x%x",
    994         pC, mediaType);
    995 
    996     switch( mediaType )
    997     {
    998         case M4DA_StreamTypeAudioAmrNarrowBand:
    999             decoderType = M4AD_kTypeAMRNB;
   1000             break;
   1001 
   1002         case M4DA_StreamTypeAudioAac:
   1003         case M4DA_StreamTypeAudioAacADTS:
   1004         case M4DA_StreamTypeAudioAacADIF:
   1005             decoderType = M4AD_kTypeAAC;
   1006             break;
   1007 
   1008         case M4DA_StreamTypeAudioMp3:
   1009             decoderType = M4AD_kTypeMP3;
   1010             break;
   1011 
   1012         case M4DA_StreamTypeAudioPcm:
   1013             decoderType = M4AD_kTypePCM;
   1014             break;
   1015 
   1016         default:
   1017             M4OSA_DEBUG_IF1(M4OSA_TRUE,
   1018                 M4VSS3GPP_ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT,
   1019                 "Audio decoder type not supported");
   1020             return M4VSS3GPP_ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT;
   1021     }
   1022 
   1023     pC->m_pAudioDecoder = pC->m_pAudioDecoderItTable[decoderType];
   1024     pC->pCurrentAudioDecoderUserData =
   1025         pC->pAudioDecoderUserDataTable[decoderType];
   1026 
   1027     if( pC->m_pAudioDecoder == M4OSA_NULL )
   1028     {
   1029         M4OSA_DEBUG_IF1(M4OSA_TRUE,
   1030             M4VSS3GPP_ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT,
   1031             "Audio decoder type not supported");
   1032         M4OSA_TRACE1_0("Audio decoder type not supported");
   1033         return M4VSS3GPP_ERR_UNSUPPORTED_INPUT_AUDIO_FORMAT;
   1034     }
   1035 
   1036     return M4NO_ERROR;
   1037 }
   1038