diff --git a/libmpcodecs/dec_video.c b/libmpcodecs/dec_video.c index 37917a4608..6727013553 100644 --- a/libmpcodecs/dec_video.c +++ b/libmpcodecs/dec_video.c @@ -76,53 +76,23 @@ void set_video_quality(sh_video_t *sh_video,int quality){ int set_video_colors(sh_video_t *sh_video,char *item,int value) { - if(vo_vaa.get_video_eq) - { - vidix_video_eq_t veq; - if(vo_vaa.get_video_eq(&veq) == 0) - { - int v_hw_equ_cap = veq.cap; - if(v_hw_equ_cap != 0) - { - if(vo_vaa.set_video_eq) - { - veq.flags = VEQ_FLG_ITU_R_BT_601; /* Fixme please !!! */ - if(strcmp(item,"Brightness") == 0) - { - if(!(v_hw_equ_cap & VEQ_CAP_BRIGHTNESS)) goto try_sw_control; - veq.brightness = value*10; - veq.cap = VEQ_CAP_BRIGHTNESS; - } - else - if(strcmp(item,"Contrast") == 0) - { - if(!(v_hw_equ_cap & VEQ_CAP_CONTRAST)) goto try_sw_control; - veq.contrast = value*10; - veq.cap = VEQ_CAP_CONTRAST; - } - else - if(strcmp(item,"Saturation") == 0) - { - if(!(v_hw_equ_cap & VEQ_CAP_SATURATION)) goto try_sw_control; - veq.saturation = value*10; - veq.cap = VEQ_CAP_SATURATION; - } - else - if(strcmp(item,"Hue") == 0) - { - if(!(v_hw_equ_cap & VEQ_CAP_HUE)) goto try_sw_control; - veq.hue = value*10; - veq.cap = VEQ_CAP_HUE; - } - else goto try_sw_control;; - vo_vaa.set_video_eq(&veq); - } - return 1; - } - } - } - try_sw_control: - if(mpvdec) return mpvdec->control(sh_video,VDCTRL_SET_EQUALIZER,item,(int)value); + vf_instance_t* vf=sh_video->vfilter; + + if (vf->control(vf, VFCTRL_SET_EQUALIZER, item, (int *)value) == CONTROL_TRUE) + return 1; + /* try software control */ + if(mpvdec) return mpvdec->control(sh_video,VDCTRL_SET_EQUALIZER, item, (int *)value); + return 0; +} + +int get_video_colors(sh_video_t *sh_video,char *item,int *value) +{ + vf_instance_t* vf=sh_video->vfilter; + + if (vf->control(vf, VFCTRL_GET_EQUALIZER, item, value) == CONTROL_TRUE) + return 1; + /* try software control */ + if(mpvdec) return mpvdec->control(sh_video,VDCTRL_GET_EQUALIZER, item, value); return 0; } @@ -201,7 +171,7 @@ mpi=mpvdec->decode(sh_video, start, in_size, drop_frame); //------------------------ frame decoded. -------------------- #ifdef ARCH_X86 - // some codecs is broken, and doesn't restore MMX state :( + // some codecs are broken, and doesn't restore MMX state :( // it happens usually with broken/damaged files. if(gCpuCaps.has3DNow){ __asm __volatile ("femms\n\t":::"memory"); diff --git a/libmpcodecs/vd.h b/libmpcodecs/vd.h index 3cebebfb60..569cc8759e 100644 --- a/libmpcodecs/vd.h +++ b/libmpcodecs/vd.h @@ -21,6 +21,7 @@ extern int vd_use_slices; #define VDCTRL_QUERY_MAX_PP_LEVEL 4 /* test for postprocessing support (max level) */ #define VDCTRL_SET_PP_LEVEL 5 /* set postprocessing level */ #define VDCTRL_SET_EQUALIZER 6 /* set color options (brightness,contrast etc) */ +#define VDCTRL_GET_EQUALIZER 7 /* get color options (brightness,contrast etc) */ // callbacks: int mpcodecs_config_vo(sh_video_t *sh, int w, int h, unsigned int preferred_outfmt); diff --git a/libmpcodecs/vf.h b/libmpcodecs/vf.h index d0cb56c765..bca3451c1c 100644 --- a/libmpcodecs/vf.h +++ b/libmpcodecs/vf.h @@ -24,7 +24,7 @@ typedef struct vf_instance_s { int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt); int (*control)(struct vf_instance_s* vf, - int request, void* data); + int request, void* data, ...); int (*query_format)(struct vf_instance_s* vf, unsigned int fmt); void (*get_image)(struct vf_instance_s* vf, @@ -49,7 +49,7 @@ typedef struct vf_instance_s { #define VFCTRL_QUERY_MAX_PP_LEVEL 4 /* test for postprocessing support (max level) */ #define VFCTRL_SET_PP_LEVEL 5 /* set postprocessing level */ #define VFCTRL_SET_EQUALIZER 6 /* set color options (brightness,contrast etc) */ - +#define VFCTRL_GET_EQUALIZER 8 /* gset color options (brightness,contrast etc) */ #define VFCTRL_DRAW_OSD 7 #include "vfcap.h" diff --git a/libmpcodecs/vf_vo.c b/libmpcodecs/vf_vo.c index d5311375e6..9189010f6e 100644 --- a/libmpcodecs/vf_vo.c +++ b/libmpcodecs/vf_vo.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "../config.h" #include "../mp_msg.h" @@ -46,13 +47,37 @@ static int config(struct vf_instance_s* vf, return 1; } -static int control(struct vf_instance_s* vf, - int request, void* data){ +static int control(struct vf_instance_s* vf, int request, void* data, ...) +{ switch(request){ +#ifdef USE_OSD case VFCTRL_DRAW_OSD: if(!vo_config_count) return CONTROL_FALSE; // vo not configured? video_out->draw_osd(); return CONTROL_TRUE; +#endif + case VFCTRL_SET_EQUALIZER: + { + va_list ap; + int value; + + if(!vo_config_count) return CONTROL_FALSE; // vo not configured? + va_start(ap, data); + value = va_arg(ap, int); + va_end(ap); + return((video_out->control(VOCTRL_SET_EQUALIZER, data, (int *)value) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE); + } + case VFCTRL_GET_EQUALIZER: + { + va_list ap; + int value; + + if(!vo_config_count) return CONTROL_FALSE; // vo not configured? + va_start(ap, data); + value = va_arg(ap, int); + va_end(ap); + return((video_out->control(VOCTRL_GET_EQUALIZER, data, (int *)value) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE); + } } // return video_out->control(request,data); return CONTROL_UNKNOWN;