Чтение несжатого AVI с помощью libavcodec

Я пытаюсь прочитать несжатый файл AVI - основной несжатый файл AVI - это растровые изображения BGR.

if(frame.format == AV_PIX_FMT_BGR24)
{
  int data_size = frame.linesize[0]*frame.height;
  my_data_ptr = new uint8_t [data_size];
  memcpy(my_data_ptr, frame.data[0], data_size);
}

Я бы ожидал, что frame.linesize[0] будет шириной * 3, но я обнаружил, что это -width * 3.

Если вручную установить data_size так, чтобы оно не было отрицательным, memcpy приводит к ошибке seg.

Форматы упакованных пикселей хранятся особым образом?


person koan    schedule 17.08.2014    source источник


Ответы (1)


Отрицательный размер строки указывает на то, что кадр инвертирован (таким образом кодируются необработанные AVI).

Указатель данных указывает на верхнюю строку, и если вы добавите отрицательный размер строки к указателю, вы перейдете к следующей строке. Это означает, что вы читаете изображение задом наперед, поэтому использование неотрицательного размера строки для memcpy в приведенном выше коде означает, что вы будете читать изображение вперед и переходить в нераспределенную память после первой строки.

person koan    schedule 25.08.2014