Что такое «размер строки» в LibAV - PullRequest
0 голосов
/ 12 ноября 2018

Я играю с кодированием видео с использованием LibAV и не могу понять цель linesize.

Например, объявление функции av_image_alloc в LibAV принимает в качестве аргументов размеры строк:

int av_image_alloc  (   uint8_t *   pointers[4],
      int   linesizes[4],
      int   w,
      int   h,
      enum AVPixelFormat    pix_fmt,
      int   align 
   )        

Я новичок в LibAV и кодировании видео.Не стесняйтесь предоставить любую ссылку, которая также может дать мне небольшой опыт кодирования видео.

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Эта функция будет выделять достаточно большой буфер для хранения данных изображения, разбивая его на один или несколько массивов компонентов (плоскостей).В зависимости от формата размер строки каждого компонента изображения будет иметь свою собственную ширину (в байтах) (которая может быть намного меньше или намного больше ширины изображения), а также будет дополняться для достижения указанного выравнивания (обычно 16 байтов длязаставить векторные инструкции работать).Например, для типичного изображения YCbCr с подвыборкой 4: 2: 0 будет 3 плоскости (то есть 3 ненулевых указателя, сохраненных в pointers), а ширина линии плоскости яркости будет (дополнена) шириной изображения, ширинойкаждая строка компонента цветности будет (дополнена) половиной ширины изображения.

Также обратите внимание, что pointers и linesizes в этой функции являются параметрами-указателями, а не массивами.

0 голосов
/ 14 августа 2019

Значения размера строки зависят от формата пикселя. Для формата пикселей NV12 каждый кадр состоит из двух плоскостей: плоскость Y и плоскость UV (значения U и V чередуются). Следовательно, linesize[0] = frame_width и linesize[1]=frame_width (из-за подвыборки число пикселей U = 1/2 пикселей яркости, а общее количество пикселей U и пикселей составляет frame_width).

Для формата пикселей RGB24 каждый кадр состоит из одной плоскости и linesize[0] только для релевантной и linesize[0] = 3*frame_width

0 голосов
/ 12 ноября 2018

linesize - ширина вашего изображения в памяти для каждого цветового канала. Может быть больше или равно w, для проблемы выравнивания памяти.

Проверьте ffmpeg av frame doc :

Для видео размеры линий должны быть кратны предпочтению выравнивания ЦП, это 16 или 32 для современных настольных ЦП. Некоторый код требует такого выравнивания, другой код может быть медленнее без правильного выравнивания, для других это не имеет значения.

Размер строки может быть больше, чем размер используемых данных - для повышения производительности может присутствовать дополнительный отступ.

...