获取“字段具有不完整类型”和“冲突类型”

时间:2022-03-31 03:14:42

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:

我正在尝试使用gcc在ubuntu上的视频支持从源代码构建pjsip。在我成功地完成了全部运行后。/配置并制作dep,我运行make,我在下面有错误:

../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和ffmpeg_util.c

ffmpeg_util.h

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

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!

帮我修正这个错误!

1 个解决方案

#1


4  

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?

看起来您看到的大多数错误都植根于enum CodecID没有被发现这一事实。不确定它在源文件中的位置,但是这个提交讨论将它重命名为AVCodecID。你确定你有最新的资料来源吗?

#1


4  

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?

看起来您看到的大多数错误都植根于enum CodecID没有被发现这一事实。不确定它在源文件中的位置,但是这个提交讨论将它重命名为AVCodecID。你确定你有最新的资料来源吗?