2011-09-28 70 views
3

我的代碼非常簡單;它消耗YUV420P數據,調整它的大小,併產生一個PNG或JPEG圖像(OS X Lion,Apple的gcc 4.2.1)。它工作正常;我使用的ffmpeg(HEAD,作爲喃喃天前),但在-pedantic-錯誤模式下運行時(這是我喜歡做的事,不時):不兼容的指針類型錯誤,sws_scale,ffmpeg

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-錯誤-pedantic,我得到的同樣的投訴,但代碼編譯並正確運行。對於我自己的神經質的理智,是否有任何方法來獲得-pedantic-errors的優點,並且你知道,編譯這些代碼?

回答

4

這在C++中是可以的,但C沒有關於const的相同規則。它不喜歡你將一個非const的uint8_t **傳遞給一個接受const uint8_t * const *的函數。在C中,可以將X *轉換爲常量X *,但它只能用於一個指針級別。下一個指針級別必須完全匹配。

+2

事實證明,正確的調用是'(const uint8_t * const *)in_pic-> data,'。不過謝謝你的回答。 –

+0

謝謝你的分享,James!我遇到了我的AVbin項目(libav/ffmpeg包裝)的確切情況。現在要少擔心的警告。 – Nathan