[FFmpeg-devel] [PATCH, v3] lavf/qsvvpp:allocate continuous memory

Li, Zhong zhong.li at intel.com
Fri Jun 14 06:34:01 EEST 2019


> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On Behalf
> Of Linjie Fu
> Sent: Tuesday, June 4, 2019 11:59 PM
> To: ffmpeg-devel at ffmpeg.org
> Cc: Fu, Linjie <linjie.fu at intel.com>
> Subject: [FFmpeg-devel] [PATCH,v3] lavf/qsvvpp:allocate continuous
> memory
> 
> Mediasdk calls CMRT to copy from video to system memory and requires
> memory to be continuously allocated across Y and UV.
> 
> Add a new path to allocate continuous memory when using system out.
> Use av_frame_get_buffer to arrange data according to pixfmt, and remove
> the introduced plane_padding.
> 
> Signed-off-by: Linjie Fu <linjie.fu at intel.com>
> ---
>  libavfilter/qsvvpp.c | 26 ++++++++++++++++++++------
>  1 file changed, 20 insertions(+), 6 deletions(-)
> 
> diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index
> 5cd1d5d345..c06171444f 100644
> --- a/libavfilter/qsvvpp.c
> +++ b/libavfilter/qsvvpp.c
> @@ -350,7 +350,7 @@ static QSVFrame *query_frame(QSVVPPContext *s,
> AVFilterLink *outlink)  {
>      AVFilterContext *ctx = outlink->src;
>      QSVFrame        *out_frame;
> -    int              ret;
> +    int              i, ret;
> 
>      clear_unused_frames(s->out_frame_list);
> 
> @@ -374,12 +374,26 @@ static QSVFrame *query_frame(QSVVPPContext
> *s, AVFilterLink *outlink)
>          out_frame->surface = (mfxFrameSurface1
> *)out_frame->frame->data[3];
>      } else {
>          /* Get a frame with aligned dimensions.
> -         * Libmfx need system memory being 128x64 aligned */
> -        out_frame->frame = ff_get_video_buffer(outlink,
> -
> FFALIGN(outlink->w, 128),
> -
> FFALIGN(outlink->h, 64));
> -        if (!out_frame->frame)
> +         * Libmfx need system memory being 128x64 aligned
> +         * and continuously allocated across Y and UV */
> +        out_frame->frame = av_frame_alloc();
> +        if (!out_frame->frame) {
>              return NULL;
> +        }
> +
> +        out_frame->frame->width  = FFALIGN(outlink->w, 128);
> +        out_frame->frame->height = FFALIGN(outlink->h, 64);
> +        out_frame->frame->format = outlink->format;
> +
> +        ret = av_frame_get_buffer(out_frame->frame, 128);
> +        if (ret < 0)
> +            return NULL;
> +
> +        /* remove plane_padding introduced by av_frame_get_buffer */
Should be well explained in the comments why need to reomove.

> +        for (i = 1; i < 4; i++) {
> +            if (out_frame->frame->data[i])
> +                out_frame->frame->data[i] -= i * 128;
> +        }

Looks like tricky workaround. If padding bytes size changed in av_frame_get_buffer, will break qsv vpp. 


More information about the ffmpeg-devel mailing list