lavfi: modify avfilter_get_matrix to support separate scale factors
authorJarek Samic <cldfire3@gmail.com>
Thu, 8 Aug 2019 13:24:31 +0000 (09:24 -0400)
committerMark Thompson <sw@jkqxz.net>
Thu, 22 Aug 2019 22:11:27 +0000 (23:11 +0100)
libavfilter/transform.c
libavfilter/transform.h
libavfilter/vf_deshake.c

index f92fc4d..f4f9e0a 100644 (file)
@@ -103,12 +103,19 @@ INTERPOLATE_METHOD(interpolate_biquadratic)
     }
 }
 
-void avfilter_get_matrix(float x_shift, float y_shift, float angle, float zoom, float *matrix) {
-    matrix[0] = zoom * cos(angle);
+void ff_get_matrix(
+    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[2] = x_shift;
     matrix[3] = -matrix[1];
-    matrix[4] = matrix[0];
+    matrix[4] = scale_y * cos(angle);
     matrix[5] = y_shift;
     matrix[6] = 0;
     matrix[7] = 0;
index 07436bf..9b0c19c 100644 (file)
@@ -60,20 +60,28 @@ enum FillMethod {
 #define FILL_DEFAULT FILL_ORIGINAL
 
 /**
- * Get an affine transformation matrix from given translation, rotation, and
- * zoom factor. The matrix will look like:
+ * Get an affine transformation matrix from given translation, rotation, and
+ * zoom factors. The matrix will look like:
  *
- * [ zoom * cos(angle),           -sin(angle),     x_shift,
- *          sin(angle),     zoom * cos(angle),     y_shift,
- *                   0,                     0,           1 ]
+ * [ scale_x * cos(angle),           -sin(angle),     x_shift,
+ *             sin(angle),  scale_y * cos(angle),     y_shift,
+ *                      0,                     0,           1 ]
  *
- * @param x_shift horizontal translation
- * @param y_shift vertical translation
- * @param angle   rotation in radians
- * @param zoom    scale percent (1.0 = 100%)
- * @param matrix  9-item affine transformation matrix
+ * @param x_shift   horizontal translation
+ * @param y_shift   vertical translation
+ * @param angle     rotation in radians
+ * @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
  */
-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.
index c8480e7..b516ea2 100644 (file)
@@ -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_height = AV_CEIL_RSHIFT(link->h, desc->log2_chroma_h);
     int aligned;
+    float transform_zoom;
 
     out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
     if (!out) {
@@ -505,10 +506,12 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
     deshake->last.angle = t.angle;
     deshake->last.zoom = t.zoom;
 
+    transform_zoom = 1.0 + t.zoom / 100.0;
+
     // 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
-    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
     ret = deshake->transform(link->dst, link->w, link->h, chroma_width, chroma_height,
                              matrix_y, matrix_uv, INTERPOLATE_BILINEAR, deshake->edge, in, out);