Несовместимая ошибка типа указателя, sws_scale, ffmpeg - PullRequest
3 голосов
/ 28 сентября 2011

Мой код очень прост; он потребляет данные YUV420P, изменяет их размер и создает изображение в формате PNG или JPEG (OS X Lion, gcc от Apple 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); 

(Вы можете предположить, что структуры AVPicture in_pic и out_pic правильно инициализированы, так как код работает ).

Ну, а какие типы данных нарушают?

из 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 и, вы знаете, скомпилировать этот код?

1 Ответ

4 голосов
/ 28 сентября 2011

Это было бы нормально в C ++, но C не имеет таких же правил относительно const. Не нравится, что вы передаете неконстантный uint8_t ** в функцию, которая принимает const uint8_t * const *.

В C вы можете преобразовать X * в const X *, но это работает только для одного уровня указателя. Следующий уровень указателя должен точно соответствовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...