Commit 5b5746b1 authored by Jarek Samic's avatar Jarek Samic Committed by Mark Thompson

lavfi: modify avfilter_get_matrix to support separate scale factors

parent d3cd33ab
...@@ -103,12 +103,19 @@ INTERPOLATE_METHOD(interpolate_biquadratic) ...@@ -103,12 +103,19 @@ INTERPOLATE_METHOD(interpolate_biquadratic)
} }
} }
void avfilter_get_matrix(float x_shift, float y_shift, float angle, float zoom, float *matrix) { void ff_get_matrix(
matrix[0] = zoom * cos(angle); float x_shift,
float y_shift,
float angle,
float scale_x,
float scale_y,
float *matrix
) {
matrix[0] = scale_x * cos(angle);
matrix[1] = -sin(angle); matrix[1] = -sin(angle);
matrix[2] = x_shift; matrix[2] = x_shift;
matrix[3] = -matrix[1]; matrix[3] = -matrix[1];
matrix[4] = matrix[0]; matrix[4] = scale_y * cos(angle);
matrix[5] = y_shift; matrix[5] = y_shift;
matrix[6] = 0; matrix[6] = 0;
matrix[7] = 0; matrix[7] = 0;
......
...@@ -60,20 +60,28 @@ enum FillMethod { ...@@ -60,20 +60,28 @@ enum FillMethod {
#define FILL_DEFAULT FILL_ORIGINAL #define FILL_DEFAULT FILL_ORIGINAL
/** /**
* Get an affine transformation matrix from a given translation, rotation, and * Get an affine transformation matrix from given translation, rotation, and
* zoom factor. The matrix will look like: * zoom factors. The matrix will look like:
* *
* [ zoom * cos(angle), -sin(angle), x_shift, * [ scale_x * cos(angle), -sin(angle), x_shift,
* sin(angle), zoom * cos(angle), y_shift, * sin(angle), scale_y * cos(angle), y_shift,
* 0, 0, 1 ] * 0, 0, 1 ]
* *
* @param x_shift horizontal translation * @param x_shift horizontal translation
* @param y_shift vertical translation * @param y_shift vertical translation
* @param angle rotation in radians * @param angle rotation in radians
* @param zoom scale percent (1.0 = 100%) * @param scale_x x scale percent (1.0 = 100%)
* @param scale_y y scale percent (1.0 = 100%)
* @param matrix 9-item affine transformation matrix * @param matrix 9-item affine transformation matrix
*/ */
void avfilter_get_matrix(float x_shift, float y_shift, float angle, float zoom, float *matrix); void ff_get_matrix(
float x_shift,
float y_shift,
float angle,
float scale_x,
float scale_y,
float *matrix
);
/** /**
* Add two matrices together. result = m1 + m2. * Add two matrices together. result = m1 + m2.
......
...@@ -421,6 +421,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) ...@@ -421,6 +421,7 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
const int chroma_width = AV_CEIL_RSHIFT(link->w, desc->log2_chroma_w); const int chroma_width = AV_CEIL_RSHIFT(link->w, desc->log2_chroma_w);
const int chroma_height = AV_CEIL_RSHIFT(link->h, desc->log2_chroma_h); const int chroma_height = AV_CEIL_RSHIFT(link->h, desc->log2_chroma_h);
int aligned; int aligned;
float transform_zoom;
out = ff_get_video_buffer(outlink, outlink->w, outlink->h); out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
if (!out) { if (!out) {
...@@ -505,10 +506,12 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) ...@@ -505,10 +506,12 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
deshake->last.angle = t.angle; deshake->last.angle = t.angle;
deshake->last.zoom = t.zoom; deshake->last.zoom = t.zoom;
transform_zoom = 1.0 + t.zoom / 100.0;
// Generate a luma transformation matrix // Generate a luma transformation matrix
avfilter_get_matrix(t.vec.x, t.vec.y, t.angle, 1.0 + t.zoom / 100.0, matrix_y); ff_get_matrix(t.vec.x, t.vec.y, t.angle, transform_zoom, transform_zoom, matrix_y);
// Generate a chroma transformation matrix // Generate a chroma transformation matrix
avfilter_get_matrix(t.vec.x / (link->w / chroma_width), t.vec.y / (link->h / chroma_height), t.angle, 1.0 + t.zoom / 100.0, matrix_uv); ff_get_matrix(t.vec.x / (link->w / chroma_width), t.vec.y / (link->h / chroma_height), t.angle, transform_zoom, transform_zoom, matrix_uv);
// Transform the luma and chroma planes // Transform the luma and chroma planes
ret = deshake->transform(link->dst, link->w, link->h, chroma_width, chroma_height, ret = deshake->transform(link->dst, link->w, link->h, chroma_width, chroma_height,
matrix_y, matrix_uv, INTERPOLATE_BILINEAR, deshake->edge, in, out); matrix_y, matrix_uv, INTERPOLATE_BILINEAR, deshake->edge, in, out);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment