我的代码很简单;它消耗YUV420P数据,调整大小并生成PNG或JPEG图像(OS X Lion,Apple的gcc 4.2.1)。它工作正常;我正在使用ffmpeg(HEAD,就像几天前的笨蛋一样),但是当运行在-pedantic-errors模式时(我不时喜欢这样做):
zc_libav.c:30: error: passing argument 2 of ‘sws_scale’ from incompatible pointer type
哎哟!那么,我的代码是什么样的?
sws_scale(sws_ctx,
in_pic->data,
in_pic->linesize,
0,
in->y,
out_pic->data,
out_pic->linesize);
(您可以假设为了参数,in_pic和out_pic AVPicture结构已正确初始化,因为代码正常工作)。
那么,有什么违规的数据类型?
来自libswscale / swscale.h的:
int sws_scale(struct SwsContext *c, const uint8_t* const srcSlice[], …
来自libavcodec / avcodec.h
typedef struct AVPicture {
uint8_t *data[4];
int linesize[4]; ///< number of bytes per line
} AVPicture;
正如我上面提到的,当我将-pedantic-errors更改为-pedantic时,我得到相同的抱怨,但代码编译并正确运行。对于我自己的神经质理智,有没有办法获得-pedantic-errors的优点,你知道,编译这段代码吗?
答案 0 :(得分:4)
这在C ++中可以,但是C没有关于const的相同规则。它不喜欢你将非const uint8_t **传递给一个带有const uint8_t * const *的函数。
在C中,您可以将X *转换为const X *,但它仅适用于一个指针级别。下一个指针级别必须完全匹配。