/*****************************************************************************
 * FUNCTION
 *  med_ext_smalloc_ext
 * DESCRIPTION
 *  
 * PARAMETERS
 *  size        [IN]        
 * RETURNS
 *  
 *****************************************************************************/
address_t med_ext_smalloc_ext(size_type size, unsigned short location, const char *file, int line)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    void *ptr;
    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (size == 0)
    {
        return NULL;
    }

    switch(location)
    {
        case MED_EXT_MEMORY_TYPE_AUDIO_NONCACHEABLE:
        case MED_EXT_MEMORY_TYPE_AUDIO_CACHEABLE:
            if (g_med_ext_mem_cntx.aud_mem_pool_id == 0)
                return NULL;
        break;
        default:
            return NULL;
    }

    if (location == MED_EXT_MEMORY_TYPE_AUDIO_NONCACHEABLE)
    {
        ptr = MED_MEM_ALLOC(g_med_ext_mem_cntx.aud_mem_pool_id, size,basename((char *)file), line);
    }
    else if (location == MED_EXT_MEMORY_TYPE_AUDIO_CACHEABLE)
    {
        ptr = MED_MEM_ALLOC_CACHEABLE(g_med_ext_mem_cntx.aud_mem_pool_id, size, MED_MEM_CACHEABLE_ALIGN_SIZE, basename((char *)file), line);
    }

    if (ptr!=NULL)
    {
        g_med_ext_mem_cntx.aud_mem_alloc_count++;
        g_med_ext_mem_cntx.aud_mem_left_size = kal_adm_get_total_left_size(g_med_ext_mem_cntx.aud_mem_pool_id);
        MED_MEM_INFO_AUD(MED_AUD_MEM_SIZE, size, g_med_ext_mem_cntx.aud_mem_left_size, ptr, g_med_ext_mem_cntx.aud_mem_alloc_count);
    }
    else
    {

        if (size < kal_adm_get_total_left_size(g_med_ext_mem_cntx.aud_mem_pool_id))
        {
            /* fragmentation */
            MED_MEM_FRAGMENTATION_AUD(MED_AUD_MEM_SIZE, size, g_med_ext_mem_cntx.aud_mem_left_size,g_med_ext_mem_cntx.aud_mem_alloc_count);
        }
        else
        {
            /* concurrent */
            MED_MEM_CONCURRENT_AUD(MED_AUD_MEM_SIZE, size, g_med_ext_mem_cntx.aud_mem_left_size,g_med_ext_mem_cntx.aud_mem_alloc_count);
        }
    }
    return (address_t) ptr;
}   /* malloc */
/*****************************************************************************
 * FUNCTION
 *  med_aud_sfree
 * DESCRIPTION
 *  
 * PARAMETERS
 *  ptr     [IN]        
 * RETURNS
 *  void
 *****************************************************************************/
void med_aud_sfree(address_t ptr)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (ptr!=NULL)
    {
        kal_adm_free(g_med_ext_mem_cntx.aud_mem_pool_id, ptr);
        g_med_ext_mem_cntx.aud_mem_alloc_count--;
        g_med_ext_mem_cntx.aud_mem_left_size = kal_adm_get_total_left_size(g_med_ext_mem_cntx.aud_mem_pool_id);
        MED_FREE_MEM_INFO_AUD(g_med_ext_mem_cntx.aud_mem_left_size, ptr, g_med_ext_mem_cntx.aud_mem_alloc_count );
    }
}
/*------------------------------------------------------------------------------

    Function name:  H264SwDecMalloc

    Purpose:
        Example implementation of H264SwDecMalloc function. Prototype of this
        function is given in H264SwDecApi.h. This implementation uses
        library function malloc for allocation of memory.

------------------------------------------------------------------------------*/
static void *VideoH264DecMalloc(unsigned int size)
{
    void *ptr = NULL;
    kal_uint32 u4Size;

    if (rH264SwCtrl.pAdmId == NULL)
    {
        ASSERT(0);
    }
    u4Size = H264_ROUND_UP_TO_POWER_OF_TWO(size, 4);

    ptr =  kal_adm_alloc(rH264SwCtrl.pAdmId, u4Size);
    if (ptr == NULL)
    {
        kal_uint32 u4LeftSize = kal_adm_get_total_left_size(rH264SwCtrl.pAdmId);
        EXT_ASSERT(0, u4LeftSize, (kal_uint32)size, 0);
    }
    drv_trace2(TRACE_GROUP_10,OPEN_API_SW_GETMEMORY,size,(kal_uint32)ptr);
    return ptr;
}