/*
 * Copyright 2015 Rockchip Electronics Co. LTD
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __M2VD_COM_H__
#define __M2VD_COM_H__

#include <stdio.h>
#include <stdlib.h>

#include "mpp_debug.h"

#define M2VD_DEMO_MODE         0

//------------------------ temp ---------------------------------
#define M2VD_TEST_TRACE       (0x00000001)
#define M2VD_TEST_TIME        (0x00000002)
#define M2VD_TEST_MUTI_THREAD (0x00000004)
#define M2VD_TEST_DUMPYUV     (0x00000008)
#define M2VD_TEST_FPGA        (0x00000010)

//log of diff
#define M2VD_DBG_FUNCTION          (0x00000001)
#define M2VD_DBG_ASSERT            (0x00000002)
#define M2VD_DBG_WARNNING          (0x00000004)
#define M2VD_DBG_LOG               (0x00000008)
#define M2VD_DBG_SEC_HEADER        (0x00000010)
#define M2VD_DBG_DUMP_REG          (0x00000020)




extern RK_U32 m2vd_debug;

#define M2VD_ERR(fmt, ...)\
do {\
        { mpp_log(fmt, ## __VA_ARGS__); }\
} while (0)

#define M2VD_ASSERT(val)\
do {\
    if (M2VD_DBG_ASSERT & m2vd_debug)\
        { mpp_assert(val); }\
} while (0)

#define M2VD_WARNNING(fmt, ...)\
do {\
    if (M2VD_DBG_WARNNING & m2vd_debug)\
        { mpp_log(fmt, ## __VA_ARGS__); }\
} while (0)

#define M2VD_LOG(fmt, ...)\
do {\
    if (M2VD_DBG_LOG & m2vd_debug)\
        {  mpp_log(fmt, ## __VA_ARGS__); }\
} while (0)


//check function return
#define M2VD_CHK_F(val)                                            \
    do{                                                       \
        if((val) < 0) {                                       \
            ret = (val);                                      \
            M2VD_WARNNING("func return error(L%d), ret:%d\n", __LINE__, ret); \
            goto __FAILED;                                    \
        }                                                     \
      } while (0)

//check value if is zero or NULL
#define M2VD_CHK_V(val, ...)\
    do{ if(!(val)){\
    ret = MPP_ERR_VALUE;\
    M2VD_WARNNING("value error(L%d), val:%d\n", __LINE__, val);\
    goto __FAILED;\
    } } while (0)

//memory malloc check
#define M2VD_CHK_M(val, ...)\
    do{ if(!(val)) {\
    ret = MPP_ERR_MALLOC;\
    M2VD_ERR("malloc buffer error(%d), pointer:%p\n", __LINE__, val);\
    M2VD_ASSERT(0); goto __FAILED;\
    } } while (0)

//file check
#define M2VD_CHK_FILE(val, path, ...)\
    do{ if(!(val)) {\
            ret = MPP_ERR_OPEN_FILE;\
            M2VD_WARNNING("open file error(line%d): %s\n", __LINE__, path);\
            M2VD_ASSERT(0); goto __FAILED;\
    } } while (0)

//!< input check
#define M2VD_CHK_I(val, ...)\
    do{ if(!(val)) {\
    ret = MPP_ERR_INIT;\
    M2VD_WARNNING("input empty(%d), val:%d\n", __LINE__, val);\
    goto __FAILED;\
    } } while (0)

#define m2vd_dbg_func(tag) \
    do {\
        if (M2VD_DBG_FUNCTION & m2vd_debug)\
            { mpp_log("%s: line(%d), func(%s)", tag, __LINE__, __FUNCTION__); }\
    } while (0)




#define  M2VD_FCLOSE(fp)    do{ if(fp) fclose(fp); fp = NULL; } while (0)

#endif
