您的位置:首页 > 移动开发 > Android开发

android-mtk方案 “CompileTimeError” 编译报错的分析 (摄像头HAL相关,其他类似报错可以参考)

2013-07-04 16:09 489 查看
“CompileTimeError” 编译报错的分析



加入如下代码之后编译报错

CONFIG_FEATURE_SI(

FID_AE_STROBE,

BY_DEFAULT(FLASHLIGHT_FORCE_OFF),

FLASHLIGHT_FORCE_ON, FLASHLIGHT_FORCE_OFF

)



编译器报错提示:

mediatek/platform/mt6572/hardware/camera/custom/imgsensor/../hal/imgsensor/cfg_ftbl_gc2035_yuv.h:148:1:

error: aggregate
'NSFeature::CompileTimeError<0> ERROR_FID_AE_STROBE__NOT_scene_indep' has incomplete type and cannot be defined

Import includes file: out/target/product/mbk72_wet_lca/obj/SHARED_LIBRARIES/libcam_camera_exif_intermediates/import_includes

target thumb C++: libcam.exif.common <= mediatek/hard



#define CHECK_FID_YUV_SI(_fid) \ // Fid2Type<_fid>::Info::isYUVSceneIndep = 0;

STATIC_CHECK(Fid2Type<_fid>::Info::isYUVSceneIndep, _fid##__NOT_scene_indep)

// _fid 满足8~23 之间是数字,则 Fid2Type<_fid>::Info::isYUVSceneIndep = 1;

// 才满足 CompileTimeError 中的 ((expr) != 0

mediatek/custom/common/hal/inc/camera_feature/camera_feature_utility.h

Fid2Type<_fid>::Info



#define STATIC_CHECK(expr, msg) \

{ CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }

// 如果 expr 为true 即不为 0,那就编译通过,如果等于0,那就编译报错。而expr最终等于 Fid2Type<_fid>::Info::isYUVSceneIndep ,所以报错了。



#define CHECK_FID_SI CHECK_FID_YUV_SI

#define CHECK_FID_SD CHECK_FID_YUV_SD

template <MUINT32 v>

struct

Int2Type

{

enum { value = v };

};

template<MBOOL> struct CompileTimeError;

template<> struct CompileTimeError<MTRUE> {};



CONFIG_FEATURE_SI(FID_AE_STROBE,

BY_DEFAULT(FLASHLIGHT_FORCE_OFF),

FLASHLIGHT_FORCE_ON, FLASHLIGHT_FORCE_OFF



#define CONFIG_FEATURE_SI(_fid, _default_macro, _table...) \

_CONFIG_FEATURE(_fid, Fid2Type<_fid>::Type) \

CHECK_FID_SI(_fid); \ // _fid =FID_AE_STROBE

_default_macro \

static type aTable[] = { _table }; \

_END_CONFIG_FEATURE()



#define _CONFIG_FEATURE(_fid, _ftype) \

case _fid: \

{ __CONFIG_FEATURE(_fid, _ftype)

#define __CONFIG_FEATURE(_fid, _ftype) \

enum { EFeatureID = _fid }; \

typedef _ftype const type;

#define _END_CONFIG_FEATURE() \

__END_CONFIG_FEATURE() \

return &FInfo; \

}

#define __END_CONFIG_FEATURE() \

STATIC_CHECK(sizeof(aDefault)==sizeof(type), _NOT_assign_DEFAULT); \

STATIC_CHECK(sizeof(aTable) > 0, _table_CANNOT_be_emtpy); \

enum { ETblNum = sizeof(aTable)/sizeof(type) }; \

static FInfo_Source<EFeatureID, ETblNum, type> \

FInfo(aDefault[0], aTable);

#define BY_DEFAULT(_default) \

type const aDefault[] = { _default };



#define ENUM_MISC_FIDS_SI(fids...)\

FID_PRE_BEGIN_MISC_SI = FID_PRE_BEGIN_SI, \ // 0

fids \

FID_OVER_LAST_MISC_SI



#define _GETFINFO_SCENE_INDEP(_sensor_type_sz) \

static \

FInfoIF* \

GetFInfo(FID_T const fid) \

{ \

MY_LOG_OBJ_ONCE(_sensor_type_sz "[SI][GetFInfo]\n"); \

switch (fid) \

{ \

#define _END_GETFINFO_SCENE_INDEP(_sensor_type_sz) \

default: \

MY_LOG( \

_sensor_type_sz "[SI][GetFInfo] unsupported FID:" \

"(fid)=(%d)", fid \

); \

break; \

} \

return NULL; \

}

//--------------------------

#define ENUM_MISC_FIDS_SI(fids...)\

FID_PRE_BEGIN_MISC_SI = FID_PRE_BEGIN_SI, \ // = 0

fids \

FID_OVER_LAST_MISC_SI // so =8

#define ENUM_RAW_ONLY_FIDS_SI(fids...)\

FID_PRE_BEGIN_RAW_ONLY_SI = FID_OVER_LAST_MISC_SI - 1, \ //=8-1=7 // key-word:

fids \

FID_OVER_LAST_RAW_ONLY_SI //so =8 ;key-word

#define ENUM_RAW_YUV_SHARED_FIDS_SI(fids...)\

FID_PRE_BEGIN_RAW_YUV_SI = FID_OVER_LAST_RAW_ONLY_SI - 1, \ // so=8-1= 7;key-word:

fids \

FID_OVER_LAST_RAW_YUV_SI // so =24

#define ENUM_YUV_ONLY_FIDS_SI(fids...)\

FID_PRE_BEGIN_YUV_ONLY_SI = FID_OVER_LAST_RAW_YUV_SI - 1, \ // =24-1 =23

fids \

FID_OVER_LAST_YUV_ONLY_SI// so =24

#define ENUM_MISC_FIDS_SD(fids...)\

FID_PRE_BEGIN_MISC_SD = FID_PRE_BEGIN_SD, \

fids \

FID_OVER_LAST_MISC_SD

#define ENUM_RAW_ONLY_SD(fids...)\

FID_PRE_BEGIN_RAW_ONLY_SD = FID_OVER_LAST_MISC_SD - 1, \

fids \

FID_OVER_LAST_RAW_ONLY_SD

#define ENUM_RAW_YUV_SHARED_FIDS_SD(fids...)\

FID_PRE_BEGIN_RAW_YUV_SD = FID_OVER_LAST_RAW_ONLY_SD - 1, \

fids \

FID_OVER_LAST_RAW_YUV_SD

#define ENUM_YUV_ONLY_SD(fids...)\

FID_PRE_BEGIN_YUV_ONLY_SD = FID_OVER_LAST_RAW_YUV_SD - 1, \

fids \

FID_OVER_LAST_YUV_ONLY_SD

//---------------



template <MUINT32 _fid>

struct FidInfo

{

template <MUINT32 _val, MUINT32 _beg, MUINT32 _end>

struct IsWithin

{

enum { Result = (_beg <= _val && _val < _end) };

};

// Result = 8<=2 && 2 < 24 = 0 && 1 = 0

enum

{

isSceneIndep =

IsWithin<_fid,FID_BEGIN_SI,FID_END_SI>::Result,

isMiscSceneIndep =

IsWithin<_fid,FID_BEGIN_MISC_SI,FID_END_MISC_SI>::Result,

isRAWSceneIndep =

IsWithin<_fid,FID_BEGIN_RAW_SI,FID_END_RAW_SI>::Result,

isYUVSceneIndep =

IsWithin<_fid,FID_BEGIN_YUV_SI,FID_END_YUV_SI>::Result, // _fid=2,FID_BEGIN_YUV_SI =8, FID_END_YUV_SI= 24,

// FID_BEGIN_YUV_SI
=FID_BEGIN_RAW_YUV_SI =FID_PRE_BEGIN_RAW_YUV_SI + 1=FID_OVER_LAST_RAW_ONLY_SI - 1 //(ENUM_RAW_ONLY_FIDS_SI)

// FID_END_YUV_SI=FID_END_YUV_ONLY_SI=FID_OVER_LAST_YUV_ONLY_SI // (ENUM_YUV_ONLY_FIDS_SI)

isSceneDep =

^^^^^^

}





mediatek/custom/common/hal/inc/camera_feature/camera_feature_id.h: //这个文件包含了"kd_camera_feature_id.h"

namespace NSFeature

{

#include "kd_camera_feature_id.h"

typedef FEATURE_ID FEATURE_ID_T;

enum

{

FID_BEGIN = FID_PRE_BEGIN + 1, // FID_BEGIN = 0+1 = 1;

FID_NUM = FID_OVER_LAST - FID_BEGIN,

//////////////////////////////////////////////////////////////////////////////

// Scene-Independent (SI) feature id.

FID_BEGIN_SI = FID_PRE_BEGIN_SI + 1,

FID_END_SI = FID_OVER_LAST_SI,

//Misc. feature id.

FID_BEGIN_MISC_SI = FID_PRE_BEGIN_MISC_SI + 1,

FID_END_MISC_SI = FID_OVER_LAST_MISC_SI,

FID_NUM_MISC_SI = FID_END_MISC_SI - FID_BEGIN_MISC_SI,

//RAW-only feature id.

FID_BEGIN_RAW_ONLY_SI = FID_PRE_BEGIN_RAW_ONLY_SI + 1,

FID_END_RAW_ONLY_SI = FID_OVER_LAST_RAW_ONLY_SI,

FID_NUM_RAW_ONLY_SI = FID_END_RAW_ONLY_SI - FID_BEGIN_RAW_ONLY_SI,

//RAW-YUV-shared feature id.

FID_BEGIN_RAW_YUV_SI = FID_PRE_BEGIN_RAW_YUV_SI + 1, // = 8 key-word

FID_END_RAW_YUV_SI = FID_OVER_LAST_RAW_YUV_SI,

FID_NUM_RAW_YUV_SI = FID_END_RAW_YUV_SI - FID_BEGIN_RAW_YUV_SI,

//YUV-only feature id.

FID_BEGIN_YUV_ONLY_SI = FID_PRE_BEGIN_YUV_ONLY_SI + 1,

FID_END_YUV_ONLY_SI = FID_OVER_LAST_YUV_ONLY_SI, // =24;ke-word

FID_NUM_YUV_ONLY_SI = FID_END_YUV_ONLY_SI - FID_BEGIN_YUV_ONLY_SI,

//RAW feature id.

FID_BEGIN_RAW_SI = FID_BEGIN_RAW_ONLY_SI,

FID_END_RAW_SI = FID_OVER_LAST_RAW_YUV_SI,

FID_NUM_RAW_SI = FID_END_RAW_SI - FID_BEGIN_RAW_SI,

//YUV feature id.

FID_BEGIN_YUV_SI = FID_BEGIN_RAW_YUV_SI, // = 8 ; key-word

FID_END_YUV_SI = FID_END_YUV_ONLY_SI, // =24;key-word

FID_NUM_YUV_SI = FID_END_YUV_SI - FID_BEGIN_YUV_SI,





mediatek/custom/common/kernel/imgsensor/inc/kd_camera_feature_id.h:

typedef enum

{

FID_PRE_BEGIN = 0,

//////////////////////////////////////////////////////////////////////////////

// Scene-Independent (SI) feature id.

FID_PRE_BEGIN_SI = FID_PRE_BEGIN,

//----------------------------------------------------------------------------

//Misc. feature id.

ENUM_MISC_FIDS_SI (

FID_ZOOM_FACTOR, // Legacy symbol (Remove if possible)

FID_AE_STROBE, //value--> 2 ;// 涉事(涉及编译错误的枚举变量)的枚举变量。

FID_ZSD,

FID_AWB2PASS,

FID_AF_LAMP,

FID_FAST_CONTINUOUS_SHOT,

),// so FID_OVER_LAST_MISC_SI = 8;

//RAW-only feature id.

ENUM_RAW_ONLY_FIDS_SI (

),

//RAW-YUV-shared feature id.

ENUM_RAW_YUV_SHARED_FIDS_SI (

FID_SCENE_MODE,//8

FID_COLOR_EFFECT, // 9

FID_CAPTURE_MODE, //10

FID_CAP_SIZE, //11

FID_PREVIEW_SIZE, //12

FID_VIDEO_PREVIEW_SIZE, //13

FID_FRAME_RATE, //14

FID_FRAME_RATE_RANGE, //15

FID_AE_FLICKER, //-->16

FID_FOCUS_DIST_NORMAL, //17

FID_FOCUS_DIST_MACRO, //18

FID_STEREO_3D_CAP_SIZE, //19

FID_STEREO_3D_PREVIEW_SIZE, //20

FID_STEREO_3D_TYPE, //21

FID_STEREO_3D_MODE, //22

FID_STEREO_3D_IMAGE_FORMAT,//23

),

//YUV-only feature id.

ENUM_YUV_ONLY_FIDS_SI (

),





// FID_BEGIN_YUV_SI =FID_BEGIN_RAW_YUV_SI =FID_PRE_BEGIN_RAW_YUV_SI + 1=FID_OVER_LAST_RAW_ONLY_SI - 1 //(ENUM_RAW_ONLY_FIDS_SI)

// FID_END_YUV_SI=FID_END_YUV_ONLY_SI=FID_OVER_LAST_YUV_ONLY_SI // (ENUM_YUV_ONLY_FIDS_SI)





//----------------------------------------------------------------------------

FID_OVER_LAST_SI = FID_OVER_LAST_YUV_ONLY_SI,

//////////////////////////////////////////////////////////////////////////////

// Scene-Dependent (SD) feature id.

FID_PRE_BEGIN_SD = FID_OVER_LAST_SI - 1,

//----------------------------------------------------------------------------

//Misc. feature id.

ENUM_MISC_FIDS_SD (

FID_FD_ON_OFF,

),

//RAW-only feature id.

ENUM_RAW_ONLY_SD (

),

//RAW-YUV-shared feature id.

ENUM_RAW_YUV_SHARED_FIDS_SD (

FID_AE_SCENE_MODE,

FID_AE_METERING,

FID_AE_ISO,

FID_AE_EV,

FID_AF_MODE,

FID_AF_METERING,

FID_AWB_MODE,

FID_ISP_EDGE,

FID_ISP_HUE,

FID_ISP_SAT,

FID_ISP_BRIGHT,

FID_ISP_CONTRAST,

),

//YUV-only feature id.

ENUM_YUV_ONLY_SD (

FID_YUV_AUTOTEST,

),

// IsWithin<_fid,FID_BEGIN_YUV_SI,FID_END_YUV_SI>::Result 限定了

// _fid 的值(也就是[b]FID_AE_STROBE,), 必须是在 ENUM_RAW_ONLY_SD 枚举的尾部 和 ENUM_YUV_ONLY_SD 枚举的尾部之间。 其实它本应该被放在 ENUM_RAW_YUV_SHARED_FIDS_SI 枚举类型中。[/b]

//上面的编译错误是为了 避免非 YUV的 枚举值 被用到.

//----------------------------------------------------------------------------

FID_OVER_LAST_SD = FID_OVER_LAST_YUV_ONLY_SD,

//////////////////////////////////////////////////////////////////////////////

FID_OVER_LAST = FID_OVER_LAST_SD,

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

} FEATURE_ID;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐