获取“字段具有不完整类型”和“冲突类型” [英] Getting “field has incomplete type” and "conflicting types"

查看:292
本文介绍了获取“字段具有不完整类型”和“冲突类型”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从源代码构建pjsip,并在ubuntu上由gcc支持视频。当我成功完成运行./configure并使dep,我运行make,我有错误以下:

  ../ src / pjmedia / ffmpeg_util.c:46:18:error:field'codec_id'has incomplete type 
../src/pjmedia/ffmpeg_util.c:148:13:error:冲突类型为'pjmedia_format_id_to_CodecID'
../src/pjmedia/ffmpeg_util.h:23:13:注意:以前的声明'pjmedia_format_id_to_CodecID'在这里
../src/pjmedia/ffmpeg_util.c:在函数'pjmedia_format_id_to_CodecID'中:
../src/pjmedia/ffmpeg_util.c:154:35:警告:[默认启用]指针和整数之间的比较
../src/pjmedia/ffmpeg_util.c:155:6:错误:解除引用指针到不完整的类型
../src/pjmedia/ffmpeg_util.c:155:6:warning:语句没有影响[-Wunused-value]
../src/pjmedia/ffmpeg_util.c:160 :5:error:取消引用指向不完整类型的指针
../src/pjmedia/ffmpeg_util.c:160:5:warning:无效的语句[-Wunused-value]
../src/ pjmedia /的ffmpeg _util.c:在顶层:
../src/pjmedia/ffmpeg_util.c:164:55:错误:参数1('codec_id')不完整的类型

这是ffmpeg_util.h和ffmpeg_util.c中的代码



ffmpeg_util.h

  #ifndef __PJMEDIA_FFMPEG_UTIL_H__ 
#define __PJMEDIA_FFMPEG_UTIL_H__

#include< pjmedia / format.h>

#ifdef _MSC_VER
#ifndef __cplusplus
#define inline _inline
#endif
#pragma warning(disable:4244)/ *可能的数据丢失* /
#endif

#include< libavutil / avutil.h>
#include< libavcodec / avcodec.h>

void pjmedia_ffmpeg_add_ref();
void pjmedia_ffmpeg_dec_ref();

pj_status_t pjmedia_format_id_to_PixelFormat(pjmedia_format_id fmt_id,
枚举PixelFormat * pixel_format);

pj_status_t PixelFormat_to_pjmedia_format_id(枚举PixelFormat pf,
pjmedia_format_id * fmt_id);

pj_status_t pjmedia_format_id_to_CodecID(pjmedia_format_id fmt_id,
enum CodecID * codec_id);

pj_status_t CodecID_to_pjmedia_format_id(枚举CodecID codec_id,
pjmedia_format_id * fmt_id);

#endif / * __PJMEDIA_FFMPEG_UTIL_H__ * /

ffmpeg_util.c

  #include< pjmedia / types.h> 
#include< pj / errno.h>
#include< pj / log.h>
#include< pj / string.h>

#if PJMEDIA_HAS_LIBAVFORMAT&& PJMEDIA_HAS_LIBAVUTIL

#includeffmpeg_util.h
#include< libavformat / avformat.h>

#define MAKE_VER(mj,mn,mi)((mj< 16)|(mn <8)|(mi <<0))
#define VER_AT_LEAST(mj,mn,mi)(MAKE_VER(LIBAVUTIL_VERSION_MAJOR,\
LIBAVUTIL_VERSION_MINOR,\
LIBAVUTIL_VERSION_MICRO)> = \
MAKE_VER(mj,mn,mi))



/ * pjmedia_format_id和的PixelFormat * /
为static const结构ffmpeg_fmt_table_t
{
pjmedia_format_id ID之间的转换表;
枚举PixelFormat pf;
} ffmpeg_fmt_table [] =
{
{PJMEDIA_FORMAT_RGBA,PIX_FMT_RGBA},
{PJMEDIA_FORMAT_RGB24,PIX_FMT_BGR24},
{PJMEDIA_FORMAT_BGRA,PIX_FMT_BGRA},
#if VER_AT_LEAST(51,20,1)
{PJMEDIA_FORMAT_GBRP,PIX_FMT_GBR24P},
#endif

{PJMEDIA_FORMAT_AYUV,PIX_FMT_NONE},
{PJMEDIA_FORMAT_YUY2,PIX_FMT_YUYV422},
{PJMEDIA_FORMAT_UYVY,PIX_FMT_UYVY422},
{PJMEDIA_FORMAT_I420,PIX_FMT_YUV420P},
// {PJMEDIA_FORMAT_YV12,PIX_FMT_YUV420P},
{PJMEDIA_FORMAT_I422,PIX_FMT_YUV422P},
{PJMEDIA_FORMAT_I420JPEG,PIX_FMT_YUVJ420P}
{PJMEDIA_FORMAT_I422JPEG,PIX_FMT_YUVJ422P},
};

/ * pjmedia_format_id和CodecID之间的转换表* /
static const struct ffmpeg_codec_table_t
{
pjmedia_format_id id;
enum CodecID codec_id;
} ffmpeg_codec_table [] =
{
{PJMEDIA_FORMAT_H261,CODEC_ID_H261},
{PJMEDIA_FORMAT_H263,CODEC_ID_H263},
{PJMEDIA_FORMAT_H263P,CODEC_ID_H263P},
{PJMEDIA_FORMAT_H264 ,CODEC_ID_H264},
{PJMEDIA_FORMAT_MPEG1VIDEO,CODEC_ID_MPEG1VIDEO},
{PJMEDIA_FORMAT_MPEG2VIDEO,CODEC_ID_MPEG2VIDEO},
{PJMEDIA_FORMAT_MPEG4,CODEC_ID_MPEG4},
{PJMEDIA_FORMAT_MJPEG,CODEC_ID_MJPEG}
};

static int pjmedia_ffmpeg_ref_cnt;

static void ffmpeg_log_cb(void * ptr,int level,const char * fmt,va_list vl);

空隙pjmedia_ffmpeg_add_ref()
{
如果(pjmedia_ffmpeg_ref_cnt ++ == 0){
av_log_set_level(AV_LOG_ERROR);
av_log_set_callback(& ffmpeg_log_cb);
av_register_all();
}
}

无效pjmedia_ffmpeg_dec_ref()
{
如果(pjmedia_ffmpeg_ref_cnt-- == 1){
/ *如何关机ffmpeg的? * /
}

if(pjmedia_ffmpeg_ref_cnt< 0)pjmedia_ffmpeg_ref_cnt = 0;
}


static void ffmpeg_log_cb(void * ptr,int level,const char * fmt,va_list vl)
{
const char * LOG_SENDER = ffmpeg的;
枚举{LOG_LEVEL = 5};
char buf [100];
int bufsize = sizeof(buf),len;
pj_str_t fmt_st;

/ *自定义回调需要自己过滤日志级别* /
if(level> av_log_get_level())
return;

/ *添加原始ffmpeg发件人以记录格式* /
if(ptr){
AVClass * avc = *(AVClass **)ptr;
len = pj_ansi_snprintf(buf,bufsize,%s:,avc-> item_name(ptr));
bufsize - = len;
}

/ *复制原始日志格式* /
len = pj_ansi_strlen(fmt);
if(len> bufsize-1)
len = bufsize-1;
pj_memcpy(buf + sizeof(buf)-bufsize,fmt,len);
bufsize - = len;

/ *修剪日志格式* /
pj_strset(& fmt_st,buf,sizeof(buf)-bufsize);
pj_strrtrim(& fmt_st);
buf [fmt_st.slen] ='\0';

pj_log(LOG_SENDER,LOG_LEVEL,buf,vl);
}


pj_status_t pjmedia_format_id_to_PixelFormat(pjmedia_format_id fmt_id,
枚举PixelFormat * pixel_format)
{
unsigned i; (i = 0; i< PJ_ARRAY_SIZE(ffmpeg_fmt_table); ++ i){
const struct ffmpeg_fmt_table_t * t =& ffmpeg_fmt_table [i];

if(t-> id == fmt_id&& t-> pf!= PIX_FMT_NONE){
* pixel_format = t-> pf;
返回PJ_SUCCESS;
}
}

* pixel_format = PIX_FMT_NONE;
返回PJ_ENOTFOUND;
}

pj_status_t PixelFormat_to_pjmedia_format_id(枚举PixelFormat pf,
pjmedia_format_id * fmt_id)
{
unsigned i; (i = 0; i< PJ_ARRAY_SIZE(ffmpeg_fmt_table); ++ i){
const struct ffmpeg_fmt_table_t * t =& ffmpeg_fmt_table [i];

if(t-> pf == pf){
if(fmt_id)* fmt_id = t-> id;
返回PJ_SUCCESS;
}
}

返回PJ_ENOTFOUND;
}

pj_status_t pjmedia_format_id_to_CodecID(pjmedia_format_id fmt_id,
枚举CodecID标注* codec_id)
{
无符号I; (i = 0; i< PJ_ARRAY_SIZE(ffmpeg_codec_table); ++ i){
const struct ffmpeg_codec_table_t * t =& ffmpeg_codec_table [i];

if(t-> id == fmt_id&& t-> codec_id!= PIX_FMT_NONE){
* codec_id = t-> codec_id;
返回PJ_SUCCESS;
}
}

* codec_id = PIX_FMT_NONE;
返回PJ_ENOTFOUND;
}

pj_status_t CodecID_to_pjmedia_format_id(枚举CodecID codec_id,
pjmedia_format_id * fmt_id)
{
unsigned i; (i = 0; i< PJ_ARRAY_SIZE(ffmpeg_codec_table); ++ i){
const struct ffmpeg_codec_table_t * t =& ffmpeg_codec_table [i];

if(t-> codec_id == codec_id){
if(fmt_id)* fmt_id = t-> id;
返回PJ_SUCCESS;
}
}

返回PJ_ENOTFOUND;
}


#ifdef _MSC_VER
#pragma注释(lib,avformat.lib)
#pragma注释(lib,avutil.lib )
#endif

#endif / * #if PJMEDIA_HAS_LIBAVFORMAT&& PJMEDIA_HAS_LIBAVUTIL * /

帮我修复这个错误!

解决方案

看起来你看到的大多数错误根植于事实枚举CodecID 未找到。不确定您的来源可能在哪里,但此提交讨论将其重命名为 AVCodecID 。你确定你有最新的来源吗?


I'm trying build pjsip from source with video support by gcc on ubuntu. After i success full run ./configure and make dep, i run make and i have error below:

../src/pjmedia/ffmpeg_util.c:46:18: error: field ‘codec_id’ has incomplete type
../src/pjmedia/ffmpeg_util.c:148:13: error: conflicting types for ‘pjmedia_format_id_to_CodecID’
../src/pjmedia/ffmpeg_util.h:23:13: note: previous declaration of ‘pjmedia_format_id_to_CodecID’ was here
../src/pjmedia/ffmpeg_util.c: In function ‘pjmedia_format_id_to_CodecID’:
../src/pjmedia/ffmpeg_util.c:154:35: warning: comparison between pointer and integer [enabled by default]
../src/pjmedia/ffmpeg_util.c:155:6: error: dereferencing pointer to incomplete type
../src/pjmedia/ffmpeg_util.c:155:6: warning: statement with no effect [-Wunused-value]
../src/pjmedia/ffmpeg_util.c:160:5: error: dereferencing pointer to incomplete type
../src/pjmedia/ffmpeg_util.c:160:5: warning: statement with no effect [-Wunused-value]
../src/pjmedia/ffmpeg_util.c: At top level:
../src/pjmedia/ffmpeg_util.c:164:55: error: parameter 1 (‘codec_id’) has incomplete type

Here is the code in ffmpeg_util.h and ffmpeg_util.c

ffmpeg_util.h

#ifndef __PJMEDIA_FFMPEG_UTIL_H__
#define __PJMEDIA_FFMPEG_UTIL_H__

#include <pjmedia/format.h>

#ifdef _MSC_VER
#   ifndef __cplusplus
#   define inline _inline
#   endif
#   pragma warning(disable:4244) /* possible loss of data */
#endif

#include <libavutil/avutil.h>
#include <libavcodec/avcodec.h>

void pjmedia_ffmpeg_add_ref();
void pjmedia_ffmpeg_dec_ref();

pj_status_t pjmedia_format_id_to_PixelFormat(pjmedia_format_id fmt_id,
                         enum PixelFormat *pixel_format);

pj_status_t PixelFormat_to_pjmedia_format_id(enum PixelFormat pf,
                         pjmedia_format_id *fmt_id);

pj_status_t pjmedia_format_id_to_CodecID(pjmedia_format_id fmt_id,
                     enum CodecID *codec_id);

pj_status_t CodecID_to_pjmedia_format_id(enum CodecID codec_id,
                     pjmedia_format_id *fmt_id);

#endif /* __PJMEDIA_FFMPEG_UTIL_H__ */

ffmpeg_util.c

#include <pjmedia/types.h>
#include <pj/errno.h>
#include <pj/log.h>
#include <pj/string.h>

#if PJMEDIA_HAS_LIBAVFORMAT && PJMEDIA_HAS_LIBAVUTIL

#include "ffmpeg_util.h"
#include <libavformat/avformat.h>

#define MAKE_VER(mj,mn,mi)  ((mj << 16) | (mn << 8) | (mi << 0))
#define VER_AT_LEAST(mj,mn,mi)  (MAKE_VER(LIBAVUTIL_VERSION_MAJOR, \
                                          LIBAVUTIL_VERSION_MINOR, \
                                          LIBAVUTIL_VERSION_MICRO) >= \
                                 MAKE_VER(mj,mn,mi))



/* Conversion table between pjmedia_format_id and PixelFormat */
static const struct ffmpeg_fmt_table_t
{
    pjmedia_format_id   id;
    enum PixelFormat    pf;
} ffmpeg_fmt_table[] =
{
    { PJMEDIA_FORMAT_RGBA, PIX_FMT_RGBA},
    { PJMEDIA_FORMAT_RGB24,PIX_FMT_BGR24},
    { PJMEDIA_FORMAT_BGRA, PIX_FMT_BGRA},
#if VER_AT_LEAST(51,20,1)
    { PJMEDIA_FORMAT_GBRP, PIX_FMT_GBR24P},
#endif

    { PJMEDIA_FORMAT_AYUV, PIX_FMT_NONE},
    { PJMEDIA_FORMAT_YUY2, PIX_FMT_YUYV422},
    { PJMEDIA_FORMAT_UYVY, PIX_FMT_UYVY422},
    { PJMEDIA_FORMAT_I420, PIX_FMT_YUV420P},
    //{ PJMEDIA_FORMAT_YV12, PIX_FMT_YUV420P},
    { PJMEDIA_FORMAT_I422, PIX_FMT_YUV422P},
    { PJMEDIA_FORMAT_I420JPEG, PIX_FMT_YUVJ420P},
    { PJMEDIA_FORMAT_I422JPEG, PIX_FMT_YUVJ422P},
};

/* Conversion table between pjmedia_format_id and CodecID */
static const struct ffmpeg_codec_table_t
{
    pjmedia_format_id   id;
    enum CodecID    codec_id;
} ffmpeg_codec_table[] =
{
    {PJMEDIA_FORMAT_H261,   CODEC_ID_H261},
    {PJMEDIA_FORMAT_H263,   CODEC_ID_H263},
    {PJMEDIA_FORMAT_H263P,  CODEC_ID_H263P},
    {PJMEDIA_FORMAT_H264,   CODEC_ID_H264},
    {PJMEDIA_FORMAT_MPEG1VIDEO, CODEC_ID_MPEG1VIDEO},
    {PJMEDIA_FORMAT_MPEG2VIDEO, CODEC_ID_MPEG2VIDEO},
    {PJMEDIA_FORMAT_MPEG4,  CODEC_ID_MPEG4},
    {PJMEDIA_FORMAT_MJPEG,  CODEC_ID_MJPEG}
};

static int pjmedia_ffmpeg_ref_cnt;

static void ffmpeg_log_cb(void* ptr, int level, const char* fmt, va_list vl);

void pjmedia_ffmpeg_add_ref()
{
    if (pjmedia_ffmpeg_ref_cnt++ == 0) {
    av_log_set_level(AV_LOG_ERROR);
    av_log_set_callback(&ffmpeg_log_cb);
    av_register_all();
    }
}

void pjmedia_ffmpeg_dec_ref()
{
    if (pjmedia_ffmpeg_ref_cnt-- == 1) {
    /* How to shutdown ffmpeg? */
    }

    if (pjmedia_ffmpeg_ref_cnt < 0) pjmedia_ffmpeg_ref_cnt = 0;
}


static void ffmpeg_log_cb(void* ptr, int level, const char* fmt, va_list vl)
{
    const char *LOG_SENDER = "ffmpeg";
    enum { LOG_LEVEL = 5 };
    char buf[100];
    int bufsize = sizeof(buf), len;
    pj_str_t fmt_st;

    /* Custom callback needs to filter log level by itself */
    if (level > av_log_get_level())
    return;

    /* Add original ffmpeg sender to log format */
    if (ptr) {
    AVClass* avc = *(AVClass**)ptr;
    len = pj_ansi_snprintf(buf, bufsize, "%s: ", avc->item_name(ptr));
    bufsize -= len;
    }

    /* Copy original log format */
    len = pj_ansi_strlen(fmt);
    if (len > bufsize-1)
    len = bufsize-1;
    pj_memcpy(buf+sizeof(buf)-bufsize, fmt, len);
    bufsize -= len;

    /* Trim log format */
    pj_strset(&fmt_st, buf, sizeof(buf)-bufsize);
    pj_strrtrim(&fmt_st);
    buf[fmt_st.slen] = '\0';

    pj_log(LOG_SENDER, LOG_LEVEL, buf, vl);
}


pj_status_t pjmedia_format_id_to_PixelFormat(pjmedia_format_id fmt_id,
                         enum PixelFormat *pixel_format)
{
    unsigned i;
    for (i=0; i<PJ_ARRAY_SIZE(ffmpeg_fmt_table); ++i) {
    const struct ffmpeg_fmt_table_t *t = &ffmpeg_fmt_table[i];
    if (t->id==fmt_id && t->pf != PIX_FMT_NONE) {
        *pixel_format = t->pf;
        return PJ_SUCCESS;
    }
    }

    *pixel_format = PIX_FMT_NONE;
    return PJ_ENOTFOUND;
}

pj_status_t PixelFormat_to_pjmedia_format_id(enum PixelFormat pf,
                         pjmedia_format_id *fmt_id)
{
    unsigned i;
    for (i=0; i<PJ_ARRAY_SIZE(ffmpeg_fmt_table); ++i) {
    const struct ffmpeg_fmt_table_t *t = &ffmpeg_fmt_table[i];
    if (t->pf == pf) {
        if (fmt_id) *fmt_id = t->id;
        return PJ_SUCCESS;
    }
    }

    return PJ_ENOTFOUND;
}

pj_status_t pjmedia_format_id_to_CodecID(pjmedia_format_id fmt_id,
                     enum CodecID *codec_id)
{
    unsigned i;
    for (i=0; i<PJ_ARRAY_SIZE(ffmpeg_codec_table); ++i) {
    const struct ffmpeg_codec_table_t *t = &ffmpeg_codec_table[i];
    if (t->id==fmt_id && t->codec_id != PIX_FMT_NONE) {
        *codec_id = t->codec_id;
        return PJ_SUCCESS;
    }
    }

    *codec_id = PIX_FMT_NONE;
    return PJ_ENOTFOUND;
}

pj_status_t CodecID_to_pjmedia_format_id(enum CodecID codec_id,
                     pjmedia_format_id *fmt_id)
{
    unsigned i;
    for (i=0; i<PJ_ARRAY_SIZE(ffmpeg_codec_table); ++i) {
    const struct ffmpeg_codec_table_t *t = &ffmpeg_codec_table[i];
    if (t->codec_id == codec_id) {
        if (fmt_id) *fmt_id = t->id;
        return PJ_SUCCESS;
    }
    }

    return PJ_ENOTFOUND;
}


#ifdef _MSC_VER
#   pragma comment( lib, "avformat.lib")
#   pragma comment( lib, "avutil.lib")
#endif

#endif  /* #if PJMEDIA_HAS_LIBAVFORMAT && PJMEDIA_HAS_LIBAVUTIL */

Help me fix this error!

解决方案

Looks like most of errors you are seeing are rooted in the fact enum CodecID is not found. Not sure where it might be in your source, but this commit discusses renaming it to AVCodecID. Are you sure you have an up-to-date source?

这篇关于获取“字段具有不完整类型”和“冲突类型”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆