[vlc-devel] [PATCH] vpx: encode: fix alignment to avoid copying line by line
Tristan Matthews
tmatth at videolan.org
Wed Mar 28 20:29:28 CEST 2018
On Tue, Mar 20, 2018 at 8:38 PM, Tristan Matthews <tmatth at videolan.org> wrote:
> This is based on a suggestion by François for the aom encoder.
>
> ---
> modules/codec/vpx.c | 15 +++++++--------
> 1 file changed, 7 insertions(+), 8 deletions(-)
>
> diff --git a/modules/codec/vpx.c b/modules/codec/vpx.c
> index 76331a714b..fdd75ba256 100644
> --- a/modules/codec/vpx.c
> +++ b/modules/codec/vpx.c
> @@ -441,23 +441,22 @@ static block_t *Encode(encoder_t *p_enc, picture_t *p_pict)
> unsigned i_h = p_enc->fmt_in.video.i_visible_height;
>
> /* Create and initialize the vpx_image */
> - if (!vpx_img_alloc(&img, VPX_IMG_FMT_I420, i_w, i_h, 1)) {
> + if (!vpx_img_alloc(&img, VPX_IMG_FMT_I420, i_w, i_h, 32)) {
> VPX_ERR(p_enc, ctx, "Failed to allocate image");
> return NULL;
> }
> for (int plane = 0; plane < p_pict->i_planes; plane++) {
> uint8_t *src = p_pict->p[plane].p_pixels;
> uint8_t *dst = img.planes[plane];
> - int src_stride = p_pict->p[plane].i_pitch;
> int dst_stride = img.stride[plane];
>
> - int size = __MIN(src_stride, dst_stride);
> - for (int line = 0; line < p_pict->p[plane].i_visible_lines; line++)
> - {
> - memcpy(dst, src, size);
> - src += src_stride;
> - dst += dst_stride;
> + if (unlikely(dst_stride != p_pict->p[plane].i_pitch)) {
> + VPX_ERR(p_enc, ctx, "Unexpected stride mismatch");
> + vpx_img_free(&img);
> + return NULL;
> }
> +
> + memcpy(dst, src, dst_stride*p_pict->p[plane].i_visible_lines);
> }
>
> int flags = 0;
> --
> 2.16.2
>
Thomas, any thoughts on this? I see that you've been using vpx
encoding as a fallback for chromecast.
More information about the vlc-devel
mailing list