[FFmpeg-devel] AVFrame linesize and OpenGL GL_UNPACK_ROW_LENGTH
Pavel Koshevoy
pkoshevoy at gmail.com
Tue May 7 05:45:57 CEST 2013
Hi,
OpenGL requires that texture row stride must be pixel aligned, because
GL_UNPACK_ROW_LENGTH parameter is expressed in pixels, not bytes.
AVFrame linesize is byte aligned on 32-byte boundary. This means that for bgr24
and similar pixel formats rows are usually not pixel aligned and AVFrame data
can not be used directly as an OpenGL texture.
A quick example is bgr24 frame of 654 pixel width for which image_get_linesize
calculates linesize 1962 and FFALIGN(1962, 32) pads it to 1984. 1984/3 =
661.3333... non-integer value, not pixel aligned.
One fix is possible by tweaking image_get_linesize function a little to pad
image width to align on 32 pixel boundary, like this:
static inline
int image_get_linesize(int width, int plane,
int max_step, int max_step_comp,
const AVPixFmtDescriptor *desc)
{
int s, shifted_w, padded_w, linesize;
if (!desc)
return AVERROR(EINVAL);
if (width < 0)
return AVERROR(EINVAL);
s = (max_step_comp == 1 || max_step_comp == 2) ? desc->log2_chroma_w : 0;
shifted_w = ((width + (1 << s) - 1)) >> s;
padded_w = (shifted_w + 31) & ~(31);
if (padded_w && max_step > INT_MAX / padded_w)
return AVERROR(EINVAL);
linesize = max_step * padded_w;
if (desc->flags & PIX_FMT_BITSTREAM)
linesize = (linesize + 7) >> 3;
return linesize;
}
Should I submit a patch for this, or is there a better way to do this?
Thank you,
Pavel.
More information about the ffmpeg-devel
mailing list