changeset 14183:c9ff4fe2caaf

add the flip filter at the end of the filter chain. Fixes -vf pp -flip and the flip option in the Gui.
author reimar
date Sat, 18 Dec 2004 14:06:35 +0000
parents 584551fb6586
children 3c825af3e761
files libmpcodecs/vd.c libmpcodecs/vf.c libmpcodecs/vf.h
diffstat 3 files changed, 23 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/libmpcodecs/vd.c	Sat Dec 18 11:26:01 2004 +0000
+++ b/libmpcodecs/vd.c	Sat Dec 18 14:06:35 2004 +0000
@@ -253,7 +253,8 @@
     if(vo_flags&VFCAP_FLIPPED) flip^=1;
     if(flip && !(vo_flags&VFCAP_FLIP)){
 	// we need to flip, but no flipping filter avail.
-	sh->vfilter=vf=vf_open_filter(vf,"flip",NULL);
+	vf_add_before_vo(&vf, "flip", NULL);
+	sh->vfilter = vf;
     }
 
     // time to do aspect ratio corrections...
--- a/libmpcodecs/vf.c	Sat Dec 18 11:26:01 2004 +0000
+++ b/libmpcodecs/vf.c	Sat Dec 18 14:06:35 2004 +0000
@@ -473,6 +473,26 @@
   return vf_open_plugin(filter_list,next,name,args);
 }
 
+/**
+ * \brief adds a filter before the last one (which should be the vo filter).
+ * \param vf start of the filter chain.
+ * \param name name of the filter to add.
+ * \param args argument list for the filter.
+ * \return pointer to the filter instance that was created.
+ */
+vf_instance_t* vf_add_before_vo(vf_instance_t **vf, char *name, char **args) {
+  vf_instance_t *vo, *prev = NULL, *new;
+  // Find the last filter (should be vf_vo)
+  for (vo = *vf; vo->next; vo = vo->next)
+    prev = vo;
+  new = vf_open_filter(vo, name, args);
+  if (prev)
+    prev->next = new;
+  else
+    *vf = new;
+  return new;
+}
+
 //============================================================================
 
 unsigned int vf_match_csp(vf_instance_t** vfp,unsigned int* list,unsigned int preferred){
--- a/libmpcodecs/vf.h	Sat Dec 18 11:26:01 2004 +0000
+++ b/libmpcodecs/vf.h	Sat Dec 18 14:06:35 2004 +0000
@@ -77,6 +77,7 @@
 
 vf_instance_t* vf_open_plugin(vf_info_t** filter_list, vf_instance_t* next, char *name, char **args);
 vf_instance_t* vf_open_filter(vf_instance_t* next, char *name, char **args);
+vf_instance_t* vf_add_before_vo(vf_instance_t **vf, char *name, char **args);
 vf_instance_t* vf_open_encoder(vf_instance_t* next, char *name, char *args);
 
 unsigned int vf_match_csp(vf_instance_t** vfp,unsigned int* list,unsigned int preferred);