--- 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