[MPlayer-dev-eng] Re: 'D' to deinterlace

Carl Eugen Hoyos cehoyos at ag.or.at
Tue Nov 14 02:27:12 CET 2006


New patch to turn deinterlacing on/off with 'D' after discussing the issue with
Reimar on IRC:

Index: input/input.h
===================================================================
--- input/input.h       (Revision 20902)
+++ input/input.h       (Arbeitskopie)
@@ -90,6 +90,7 @@
 #define MP_CMD_RADIO_SET_CHANNEL 88
 #define MP_CMD_RADIO_SET_FREQ 89
 #define MP_CMD_SET_MOUSE_POS 90
+#define MP_CMD_STEP_PROPERTY 91

 #define MP_CMD_GUI_EVENTS       5000
 #define MP_CMD_GUI_LOADFILE     5001
Index: input/input.c
===================================================================
--- input/input.c       (Revision 20902)
+++ input/input.c       (Arbeitskopie)
@@ -158,6 +158,8 @@
   { MP_CMD_CEXIT, "exit", 0, { {-1,{0}} } },
   { MP_CMD_CHIDE, "hide", 0, { {MP_CMD_ARG_INT,{3000}}, {-1,{0}} } },
 #endif
+  { MP_CMD_STEP_PROPERTY, "step_property", 1, { {MP_CMD_ARG_STRING, {0}},
+      {MP_CMD_ARG_INT,{1}}, {-1,{0}} } },

   { MP_CMD_GET_VO_FULLSCREEN, "get_vo_fullscreen", 0, { {-1,{0}} } },
   { MP_CMD_GET_SUB_VISIBILITY, "get_sub_visibility", 0, { {-1,{0}} } },
@@ -370,6 +372,7 @@
   { { '7', 0 }, "saturation -1" },
   { { '8', 0 }, "saturation 1" },
   { { 'd', 0 }, "frame_drop" },
+  { { 'D', 0 }, "step_property deinterlace" },
   { { 'r', 0 }, "sub_pos -1" },
   { { 't', 0 }, "sub_pos +1" },
   { { 'a', 0 }, "sub_alignment" },
Index: mplayer.c
===================================================================
--- mplayer.c   (Revision 20902)
+++ mplayer.c   (Arbeitskopie)
@@ -1880,6 +1880,30 @@
     }
 }

+static int mp_property_deinterlace(m_option_t* prop,int action,void* arg) {
+    int toggle = -1;
+    if (!sh_video || !sh_video->vfilter) return M_PROPERTY_UNAVAILABLE;
+    switch(action) {
+    case M_PROPERTY_GET:
+        if(!arg) return 0;
+        ((vf_instance_t*)sh_video->vfilter)->control
+                (sh_video->vfilter, VFCTRL_GET_DEINTERLACE,arg);
+        return 1;
+    case M_PROPERTY_SET:
+        if(!arg) return 0;
+        M_PROPERTY_CLAMP(prop,*(int*)arg);
+        ((vf_instance_t*)sh_video->vfilter)->control
+                (sh_video->vfilter, VFCTRL_SET_DEINTERLACE,arg);
+        return 1;
+    case M_PROPERTY_STEP_UP:
+    case M_PROPERTY_STEP_DOWN:
+        ((vf_instance_t*)sh_video->vfilter)->control
+                (sh_video->vfilter, VFCTRL_SET_DEINTERLACE, &toggle);
+    default:
+        return 1;
+    }
+}
+
 /// Panscan (RW)
 static int mp_property_panscan(m_option_t* prop,int action,void* arg) {

@@ -2424,6 +2448,8 @@
     // Video
     { "fullscreen", mp_property_fullscreen, CONF_TYPE_FLAG,
       M_OPT_RANGE, 0, 1, NULL },
+    { "deinterlace", mp_property_deinterlace, CONF_TYPE_FLAG,
+      M_OPT_RANGE, 0, 1, NULL },
     { "ontop", mp_property_ontop, CONF_TYPE_FLAG,
       M_OPT_RANGE, 0, 1, NULL },
     { "rootwin", mp_property_rootwin, CONF_TYPE_FLAG,
@@ -4636,6 +4662,14 @@
                    cmd->args[0].v.s,cmd->args[1].v.s);

     } break;
+    case MP_CMD_STEP_PROPERTY: {
+        m_option_t* prop = mp_property_find(cmd->args[0].v.s);
+        if(!prop) mp_msg(MSGT_CPLAYER,MSGL_WARN,
+                "Unkown property: '%s'\n",cmd->args[0].v.s);
+        else if(m_property_do(prop,M_PROPERTY_STEP_UP,cmd->args[1].v.s) <= 0)
+            mp_msg(MSGT_CPLAYER,MSGL_WARN,
+                    "Failed to increment property '%s'.\n",cmd->args[0].v.s);
+    } break;
     case MP_CMD_GET_PROPERTY: {
         m_option_t* prop;
         void* val;
Index: libmpcodecs/vf.h
===================================================================
--- libmpcodecs/vf.h    (Revision 20902)
+++ libmpcodecs/vf.h    (Arbeitskopie)
@@ -79,6 +79,8 @@
 #define VFCTRL_SCREENSHOT      14 /* Make a screenshot */
 #define VFCTRL_INIT_EOSD       15 /* Select EOSD renderer */
 #define VFCTRL_DRAW_EOSD       16 /* Render EOSD */
+#define VFCTRL_SET_DEINTERLACE 17 /* Set deinterlacing status */
+#define VFCTRL_GET_DEINTERLACE 18 /* Get deinterlacing status */

 #include "vfcap.h"

Index: libmpcodecs/vf_vo.c
===================================================================
--- libmpcodecs/vf_vo.c (Revision 20902)
+++ libmpcodecs/vf_vo.c (Arbeitskopie)
@@ -80,6 +80,18 @@
 static int control(struct vf_instance_s* vf, int request, void* data)
 {
     switch(request){
+    case VFCTRL_GET_DEINTERLACE:
+    {
+        if(!video_out) return CONTROL_FALSE; // vo not configured?
+        return(video_out->control(VOCTRL_GET_DEINTERLACE, data)
+                == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE;
+    }
+    case VFCTRL_SET_DEINTERLACE:
+    {
+        if(!video_out) return CONTROL_FALSE; // vo not configured?
+        return(video_out->control(VOCTRL_SET_DEINTERLACE, data)
+                == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE;
+    }
 #ifdef USE_OSD
     case VFCTRL_DRAW_OSD:
        if(!vo_config_count) return CONTROL_FALSE; // vo not configured?
Index: libvo/video_out.h
===================================================================
--- libvo/video_out.h   (Revision 20902)
+++ libvo/video_out.h   (Arbeitskopie)
@@ -65,6 +65,9 @@
   int mt, mb, ml, mr; // borders (top, bottom, left, right)
 } mp_eosd_res_t;

+#define VOCTRL_SET_DEINTERLACE 30
+#define VOCTRL_GET_DEINTERLACE 31
+
 // Vo can be used by xover
 #define VOCTRL_XOVERLAY_SUPPORT 22

Index: libvo/vo_xvmc.c
===================================================================
--- libvo/vo_xvmc.c     (Revision 20902)
+++ libvo/vo_xvmc.c     (Arbeitskopie)
@@ -1379,6 +1379,15 @@
 static int control(uint32_t request, void *data, ... )
 {
    switch (request){
+      case VOCTRL_GET_DEINTERLACE:
+        *(int*)data = bob_deinterlace;
+        return VO_TRUE;
+      case VOCTRL_SET_DEINTERLACE:
+        if (*(int*)data == -1)
+            bob_deinterlace = !bob_deinterlace;
+        else
+            bob_deinterlace = *(int*)data;
+        return VO_TRUE;
       case VOCTRL_QUERY_FORMAT:
          return query_format(*((uint32_t*)data));
       case VOCTRL_DRAW_IMAGE:





More information about the MPlayer-dev-eng mailing list