[vlc-devel] [PATCH 5/9] Make transform filter work with chains where format change is not allowed.
Matthias Keiser
matthias at tristan-inc.com
Wed Mar 5 17:01:26 CET 2014
---
modules/video_filter/transform.c | 67 +++++++++++++++++++++++-----------------
1 file changed, 38 insertions(+), 29 deletions(-)
diff --git a/modules/video_filter/transform.c b/modules/video_filter/transform.c
index 60fdaa1..c249521 100644
--- a/modules/video_filter/transform.c
+++ b/modules/video_filter/transform.c
@@ -229,6 +229,7 @@ typedef struct {
char name[16];
convert_t convert;
convert_t iconvert;
+ video_transform_t operation;
void (*plane8) (plane_t *dst, const plane_t *src);
void (*plane16)(plane_t *dst, const plane_t *src);
void (*plane32)(plane_t *dst, const plane_t *src);
@@ -236,18 +237,18 @@ typedef struct {
void (*yuyv)(plane_t *dst, const plane_t *src);
} transform_description_t;
-#define DESC(str, f, invf) \
- { str, f, invf, Plane8_##f, Plane16_##f, Plane32_##f, \
+#define DESC(str, f, invf, op) \
+ { str, f, invf, op, Plane8_##f, Plane16_##f, Plane32_##f, \
Plane422_##f, PlaneYUY2_##f }
static const transform_description_t descriptions[] = {
- DESC("90", R90, R270),
- DESC("180", R180, R180),
- DESC("270", R270, R90),
- DESC("hflip", HFlip, HFlip),
- DESC("vflip", VFlip, VFlip),
- DESC("transpose", Transpose, Transpose),
- DESC("antitranspose", AntiTranspose, AntiTranspose),
+ DESC("90", R90, R270, TRANSFORM_R90),
+ DESC("180", R180, R180, TRANSFORM_R180),
+ DESC("270", R270, R90, TRANSFORM_R270),
+ DESC("hflip", HFlip, HFlip, TRANSFORM_HFLIP),
+ DESC("vflip", VFlip, VFlip, TRANSFORM_VFLIP),
+ DESC("transpose", Transpose, Transpose, TRANSFORM_TRANSPOSE),
+ DESC("antitranspose", AntiTranspose, AntiTranspose, TRANSFORM_ANTI_TRANSPOSE),
};
static bool dsc_is_rotated(const transform_description_t *dsc)
@@ -373,19 +374,38 @@ static int Open(vlc_object_t *object)
}
}
}
+ }
+
+ /*
+ * Note: we neither compare nor set dst->orientation,
+ * the caller needs to do it manually (user might want
+ * to transform video without changing the orientation).
+ */
+
+ video_format_t src_trans = *src;
+ video_format_TransformBy(&src_trans, dsc->operation);
+
+ if (!filter->b_allow_fmt_out_change &&
+ (dst->i_width != src_trans.i_width ||
+ dst->i_visible_width != src_trans.i_visible_width ||
+ dst->i_height != src_trans.i_height ||
+ dst->i_visible_height != src_trans.i_visible_height ||
+ dst->i_sar_num != src_trans.i_sar_num ||
+ dst->i_sar_den != src_trans.i_sar_den ||
+ dst->i_x_offset != src_trans.i_x_offset ||
+ dst->i_y_offset != src_trans.i_y_offset)) {
- if (!filter->b_allow_fmt_out_change) {
msg_Err(filter, "Format change is not allowed");
goto error;
}
-
- dst->i_width = src->i_height;
- dst->i_visible_width = src->i_visible_height;
- dst->i_height = src->i_width;
- dst->i_visible_height = src->i_visible_width;
- dst->i_sar_num = src->i_sar_den;
- dst->i_sar_den = src->i_sar_num;
- }
+ dst->i_width = src_trans.i_width;
+ dst->i_visible_width = src_trans.i_visible_width;
+ dst->i_height = src_trans.i_height;
+ dst->i_visible_height = src_trans.i_visible_height;
+ dst->i_sar_num = src_trans.i_sar_num;
+ dst->i_sar_den = src_trans.i_sar_den;
+ dst->i_x_offset = src_trans.i_x_offset;
+ dst->i_y_offset = src_trans.i_y_offset;
/* Deal with weird packed formats */
switch (src->i_chroma) {
@@ -406,17 +426,6 @@ static int Open(vlc_object_t *object)
goto error;
}
- dst->i_x_offset = INT_MAX;
- dst->i_y_offset = INT_MAX;
- for (int i = 0; i < 2; i++) {
- int tx, ty;
- dsc->iconvert(&tx, &ty, src->i_width, src->i_height,
- src->i_x_offset + i * (src->i_visible_width - 1),
- src->i_y_offset + i * (src->i_visible_height - 1));
- dst->i_x_offset = __MIN(dst->i_x_offset, (unsigned)(1 + tx));
- dst->i_y_offset = __MIN(dst->i_y_offset, (unsigned)(1 + ty));
- }
-
filter->p_sys = sys;
filter->pf_video_filter = Filter;
filter->pf_video_mouse = Mouse;
--
1.8.3.4 (Apple Git-47)
More information about the vlc-devel
mailing list