C++程序  |  264行  |  11.89 KB

/*******************************************************************************
* Copyright (C) 2018 Cadence Design Systems, Inc.
* 
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to use this Software with Cadence processor cores only and 
* not with any other processors and platforms, subject to
* the following conditions:
* 
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

******************************************************************************/

/*******************************************************************************
 * xa-class-base.h
 *
 * Generic Xtensa Audio codecs interfaces
 *
 ******************************************************************************/

#ifndef __XA_CLASS_BASE_H
#define __XA_CLASS_BASE_H

/*******************************************************************************
 * Includes
 ******************************************************************************/

/* ...audio-specific API */
#include "audio/xa_type_def.h"
#include "audio/xa_error_standards.h"
#include "audio/xa_apicmd_standards.h"
#include "audio/xa_memory_standards.h"

/*******************************************************************************
 * Generic codec structure
 ******************************************************************************/

typedef struct XACodecBase XACodecBase;

/* ...memory buffer initialization */
typedef XA_ERRORCODE  (*xa_codec_memtab_f)(XACodecBase *codec, WORD32 i, WORD32 type, WORD32 size, WORD32 align, u32 core);

/* ...preprocessing operation */
typedef XA_ERRORCODE  (*xa_codec_preprocess_f)(XACodecBase *);

/* ...postprocessing operation */
typedef XA_ERRORCODE  (*xa_codec_postprocess_f)(XACodecBase *, int);

/* ...parameter setting function */
typedef XA_ERRORCODE  (*xa_codec_setparam_f)(XACodecBase *, WORD32, pVOID p);

/* ...parameter retrival function */
typedef XA_ERRORCODE  (*xa_codec_getparam_f)(XACodecBase *, WORD32, pVOID p);

/*******************************************************************************
 * Codec instance structure
 ******************************************************************************/

struct XACodecBase
{
    /***************************************************************************
     * Control data
     **************************************************************************/

    /* ...generic component handle */
    xf_component_t          component;

    /* ...codec API entry point (function) */
    xa_codec_func_t        *process;

    /* ...codec API handle, passed to *process */
    xf_mm_buffer_t          api;

    /* ...memory table buffer */
    xf_mm_buffer_t          mem_tabs;

    /* ...persistent memory buffer */
    xf_mm_buffer_t          persist;

    /* ...scratch memory pointer */
    void                   *scratch;

    /* ...codec control state */
    u32                     state;

    /***************************************************************************
     * Codec-specific methods
     **************************************************************************/

    /* ...memory buffer initialization */
    xa_codec_memtab_f       memtab;
 
    /* ...preprocessing function */
    xa_codec_preprocess_f   preprocess;

    /* ...postprocessing function */
    xa_codec_postprocess_f  postprocess;

    /* ...configuration parameter setting function */
    xa_codec_setparam_f     setparam;

    /* ...configuration parameter retrieval function */
    xa_codec_getparam_f     getparam;
    
    /* ...command-processing table */
    XA_ERRORCODE (* const * command)(XACodecBase *, xf_message_t *);
    
    /* ...command-processing table size */
    u32                     command_num;
};

/*******************************************************************************
 * Base codec execution flags
 ******************************************************************************/

/* ...codec static initialization completed */
#define XA_BASE_FLAG_POSTINIT           (1 << 0)

/* ...codec runtime initialization sequence */
#define XA_BASE_FLAG_RUNTIME_INIT       (1 << 1)

/* ...codec steady execution state */
#define XA_BASE_FLAG_EXECUTION          (1 << 2)

/* ...execution stage completed */
#define XA_BASE_FLAG_COMPLETED          (1 << 3)

/* ...data processing scheduling flag */
#define XA_BASE_FLAG_SCHEDULE           (1 << 4)

/* ...base codec flags accessor */
#define __XA_BASE_FLAGS(flags)          ((flags) & ((1 << 5) - 1))

/* ...custom execution flag */
#define __XA_BASE_FLAG(f)               ((f) << 5)

/*******************************************************************************
 * Local macros definitions
 ******************************************************************************/

/* ...audio-framework API function execution */
#define XA_CHK(cond)                            \
({                                              \
    XA_ERRORCODE  __e = (cond);                 \
    if (__e != XA_NO_ERROR)                     \
    {                                           \
        if (XA_ERROR_SEVERITY(__e))             \
        {                                       \
            TRACE(ERROR, _x("error: %X"), __e); \
            return __e;                         \
        }                                       \
        TRACE(WARNING, _x("warning: %X"), __e); \
    }                                           \
    __e;                                        \
})

/* ...low-level codec API function execution */
#define XA_API(codec, cmd, idx, pv)                                                         \
({                                                                                          \
    XA_ERRORCODE  __e;                                                                      \
    __e = (codec)->process((xa_codec_handle_t)(codec)->api.addr, (cmd), (idx), (pv));       \
    if (__e != XA_NO_ERROR)                                                                 \
    {                                                                                       \
        if (XA_ERROR_SEVERITY(__e))                                                         \
        {                                                                                   \
            TRACE(ERROR, _x("[%p]:(%d, %d, %p): %X"), (codec), (cmd), (idx), (pv), __e);    \
            return __e;                                                                     \
        }                                                                                   \
        TRACE(WARNING, _x("%X"), __e);                                                      \
    }                                                                                       \
    __e;                                                                                    \
})

#define XA_API_NORET(codec, cmd, idx, pv)                                                   \
({                                                                                          \
    XA_ERRORCODE  __e;                                                                      \
    __e = (codec)->process((xa_codec_handle_t)(codec)->api.addr, (cmd), (idx), (pv));       \
    if (__e != XA_NO_ERROR)                                                                 \
    {                                                                                       \
        if (XA_ERROR_SEVERITY(__e))                                                         \
        {                                                                                   \
            TRACE(ERROR, _x("[%p]:(%d, %d, %p): %X"), (codec), (cmd), (idx), (pv), __e);    \
        }                                                                                   \
        TRACE(WARNING, _x("%X"), __e);                                                      \
    }                                                                                       \
    __e;                                                                                    \
})

/* ...codec hook invocation */
#define CODEC_API(codec, func, ...)                                 \
({                                                                  \
    XA_ERRORCODE    __e = (codec)->func((codec), ##__VA_ARGS__);    \
                                                                    \
    if (__e != XA_NO_ERROR)                                         \
    {                                                               \
        if (XA_ERROR_SEVERITY(__e))                                 \
        {                                                           \
            /* ...actual error is reported by the codec */          \
            TRACE(ERROR, _x("[%p]: " #func ": %X"), (codec), __e);  \
            return __e;                                             \
        }                                                           \
                                                                    \
        TRACE(WARNING, _x("warning: %X"), __e);                     \
    }                                                               \
    __e;                                                            \
})

/* ...allocate local memory on specific core */
#define XMALLOC(p, size, align, core)                                           \
do                                                                              \
{                                                                               \
    if (xf_mm_alloc_buffer((size), (align), (core), (p)) != 0)                  \
    {                                                                           \
        TRACE(ERROR, _x("Failed to allocate %d bytes of memory"), (size));      \
        return XA_API_FATAL_MEM_ALLOC;                                          \
    }                                                                           \
                                                                                \
    if (((u32)((p)->addr) & ((align) - 1)) != 0)                                \
    {                                                                           \
        TRACE(ERROR, _x("Invalid %d-algnment: %p"), (align), (p)->addr);        \
        return XA_API_FATAL_MEM_ALIGN;                                          \
    }                                                                           \
}                                                                               \
while (0)

/*******************************************************************************
 * Public API
 ******************************************************************************/

/* ...SET-PARAM processing */
extern XA_ERRORCODE xa_base_set_param(XACodecBase *base, xf_message_t *m);

/* ...GET-PARAM-EXT message processing */
extern XA_ERRORCODE xa_base_set_param_ext(XACodecBase *base, xf_message_t *m);

/* ...GET-PARAM message processing */
extern XA_ERRORCODE xa_base_get_param(XACodecBase *base, xf_message_t *m);

/* ...GET-PARAM-EXT message processing */
extern XA_ERRORCODE xa_base_get_param_ext(XACodecBase *base, xf_message_t *m);

/* ...data processing scheduling */
extern void xa_base_schedule(XACodecBase *base, u32 dts);

/* ...cancel internal scheduling message */
extern void xa_base_cancel(XACodecBase *base);

/* ...base codec factory */
extern XACodecBase * xa_base_factory(u32 core, u32 size, xa_codec_func_t process);

/* ...base codec destructor */
extern void xa_base_destroy(XACodecBase *base, u32 size, u32 core);

#endif  /* __XA_CLASS_BASE_H */