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

Linjie Fu linjie.fu at intel.com
Tue Jun 4 18:59:07 EEST 2019


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 */
+        for (i = 1; i < 4; i++) {
+            if (out_frame->frame->data[i])
+                out_frame->frame->data[i] -= i * 128;
+        }
 
         out_frame->frame->width  = outlink->w;
         out_frame->frame->height = outlink->h;
-- 
2.17.1



More information about the ffmpeg-devel mailing list