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