diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index 74d0b3c94d..31879d069a 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -1022,6 +1022,13 @@ static int get_buffer2_direct(AVCodecContext *avctx, AVFrame *pic, int flags) for (int n = 0; n < AV_NUM_DATA_POINTERS; n++) stride_align = MPMAX(stride_align, linesize_align[n]); + // Note: texel sizes may be NPOT, so use full lcm instead of max + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pic->format); + if (!(desc->flags & AV_PIX_FMT_FLAG_BITSTREAM)) { + for (int n = 0; n < desc->nb_components; n++) + stride_align = mp_lcm(stride_align, desc->comp[n].step); + } + int imgfmt = pixfmt2imgfmt(pic->format); if (!imgfmt) goto fallback; diff --git a/video/out/vo.h b/video/out/vo.h index 710bd6e10f..233f8c1094 100644 --- a/video/out/vo.h +++ b/video/out/vo.h @@ -356,8 +356,8 @@ struct vo_driver { * allocated image. It's even possible that only 1 plane uses the buffer * allocated by the get_image function. The VO has to check for this. * - * stride_align is always a value >=1 that is a power of 2. The stride - * values of the returned image must be divisible by this value. + * stride_align is always a value >=1. The stride values of the returned + * image must be divisible by this value. This may be a non power of two. * * flags is a combination of VO_DR_FLAG_* flags. *