---
Just VAAPI here because with the following patch it has support to actually use 
it in libavfilter.  If wanted it could be enabled for all hardware formats, or 
maybe a specific whitelist?


 libavfilter/vf_crop.c | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/libavfilter/vf_crop.c b/libavfilter/vf_crop.c
index 4122d52f8..dc7fa0dde 100644
--- a/libavfilter/vf_crop.c
+++ b/libavfilter/vf_crop.c
@@ -107,6 +107,7 @@ static int query_formats(AVFilterContext *ctx)
         AV_PIX_FMT_RGB8,         AV_PIX_FMT_BGR8,
         AV_PIX_FMT_RGB4_BYTE,    AV_PIX_FMT_BGR4_BYTE,
         AV_PIX_FMT_PAL8,         AV_PIX_FMT_GRAY8,
+        AV_PIX_FMT_VAAPI,
         AV_PIX_FMT_NONE
     };
 
@@ -162,8 +163,14 @@ static int config_input(AVFilterLink *link)
     s->var_values[VAR_T]     = NAN;
 
     av_image_fill_max_pixsteps(s->max_step, NULL, pix_desc);
+
+    if (pix_desc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
+        s->hsub = 1;
+        s->vsub = 1;
+    } else {
     s->hsub = pix_desc->log2_chroma_w;
     s->vsub = pix_desc->log2_chroma_h;
+    }
 
     if ((ret = av_expr_parse_and_eval(&res, (expr = s->ow_expr),
                                       var_names, s->var_values,
@@ -242,9 +249,6 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame)
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format);
     int i;
 
-    frame->width  = s->w;
-    frame->height = s->h;
-
     s->var_values[VAR_T] = frame->pts == AV_NOPTS_VALUE ?
         NAN : frame->pts * av_q2d(link->time_base);
     s->var_values[VAR_X] = av_expr_eval(s->x_pexpr, s->var_values, NULL);
@@ -269,6 +273,16 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame)
             (int)s->var_values[VAR_N], s->var_values[VAR_T], s->x,
             s->y, s->x+s->w, s->y+s->h);
 
+    if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
+        frame->crop_top   += s->y;
+        frame->crop_left  += s->x;
+        frame->crop_bottom = frame->height - frame->crop_top - 
frame->crop_bottom - s->h;
+        frame->crop_right  = frame->width  - frame->crop_left - 
frame->crop_right - s->w;
+
+    } else {
+        frame->width  = s->w;
+        frame->height = s->h;
+
     frame->data[0] += s->y * frame->linesize[0];
     frame->data[0] += s->x * s->max_step[0];
 
@@ -286,6 +300,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame)
         frame->data[3] += s->y * frame->linesize[3];
         frame->data[3] += s->x * s->max_step[3];
     }
+    }
 
     s->var_values[VAR_N] += 1.0;
 
-- 
2.15.1

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to