diff options
Diffstat (limited to 'libmpcodecs/vd.c')
-rw-r--r-- | libmpcodecs/vd.c | 156 |
1 files changed, 65 insertions, 91 deletions
diff --git a/libmpcodecs/vd.c b/libmpcodecs/vd.c index ea6b6b289e..1e7d87312b 100644 --- a/libmpcodecs/vd.c +++ b/libmpcodecs/vd.c @@ -22,7 +22,7 @@ #include "config.h" #include "mp_msg.h" -#include "help_mp.h" +#include "options.h" #include "codec-cfg.h" @@ -118,41 +118,14 @@ const vd_functions_t * const mpcodecs_vd_drivers[] = { #include "libvo/video_out.h" -// libvo opts: -int fullscreen = 0; -int vidmode = 0; -int softzoom = 0; -int flip = -1; -int opt_screen_size_x = 0; -int opt_screen_size_y = 0; -float screen_size_xy = 0; -float movie_aspect = -1.0; -int vo_flags = 0; -int vd_use_slices = 1; - -/** global variables for gamma, brightness, contrast, saturation and hue - modified by mplayer.c and gui/mplayer/gtk/eq.c: - ranges -100 - 100 - 1000 if the vo default should be used -*/ -int vo_gamma_gamma = 1000; -int vo_gamma_brightness = 1000; -int vo_gamma_contrast = 1000; -int vo_gamma_saturation = 1000; -int vo_gamma_hue = 1000; - -extern const vd_functions_t *mpvdec; // FIXME! - -#define SCREEN_SIZE_X 1 -#define SCREEN_SIZE_Y 1 - int mpcodecs_config_vo(sh_video_t *sh, int w, int h, unsigned int preferred_outfmt) { + struct MPOpts *opts = sh->opts; int i, j; unsigned int out_fmt = 0; - int screen_size_x = 0; //SCREEN_SIZE_X; - int screen_size_y = 0; //SCREEN_SIZE_Y; + int screen_size_x = 0; + int screen_size_y = 0; vf_instance_t *vf = sh->vfilter, *sc = NULL; int palette = 0; int vocfg_flags = 0; @@ -166,14 +139,12 @@ int mpcodecs_config_vo(sh_video_t *sh, int w, int h, return 0; mp_msg(MSGT_DECVIDEO, MSGL_V, - "VDec: vo config request - %d x %d (preferred colorspace: %s)\n", w, - h, vo_format_name(preferred_outfmt)); - -// if(!vf) return 1; // temp hack + "VDec: vo config request - %d x %d (preferred colorspace: %s)\n", + w, h, vo_format_name(preferred_outfmt)); if (get_video_quality_max(sh) <= 0 && divx_quality) { // user wants postprocess but no pp filter yet: - sh->vfilter = vf = vf_open_filter(vf, "pp", NULL); + sh->vfilter = vf = vf_open_filter(opts, vf, "pp", NULL); } // check if libvo and codec has common outfmt (no conversion): csp_again: @@ -199,8 +170,8 @@ int mpcodecs_config_vo(sh_video_t *sh, int w, int h, if ((flags & VFCAP_CSP_SUPPORTED_BY_HW) || (flags & VFCAP_CSP_SUPPORTED && j < 0)) { // check (query) if codec really support this outfmt... - sh->outfmtidx = j; // pass index to the control() function this way - if (mpvdec->control(sh, VDCTRL_QUERY_FORMAT, &out_fmt) == + sh->outfmtidx = j; // pass index to the control() function this way + if (sh->vd_driver->control(sh, VDCTRL_QUERY_FORMAT, &out_fmt) == CONTROL_FALSE) { mp_msg(MSGT_CPLAYER, MSGL_DBG2, "vo_debug: codec query_format(%s) returned FALSE\n", @@ -208,15 +179,15 @@ int mpcodecs_config_vo(sh_video_t *sh, int w, int h, continue; } j = i; - vo_flags = flags; + sh->output_flags = flags; if (flags & VFCAP_CSP_SUPPORTED_BY_HW) break; } else if (!palette && !(flags & (VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_CSP_SUPPORTED)) && (out_fmt == IMGFMT_RGB8 || out_fmt == IMGFMT_BGR8)) { - sh->outfmtidx = j; // pass index to the control() function this way - if (mpvdec->control(sh, VDCTRL_QUERY_FORMAT, &out_fmt) != + sh->outfmtidx = j; // pass index to the control() function this way + if (sh->vd_driver->control(sh, VDCTRL_QUERY_FORMAT, &out_fmt) != CONTROL_FALSE) palette = 1; } @@ -224,15 +195,17 @@ int mpcodecs_config_vo(sh_video_t *sh, int w, int h, if (j < 0) { // TODO: no match - we should use conversion... if (strcmp(vf->info->name, "scale") && palette != -1) { - mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_CouldNotFindColorspace); - sc = vf = vf_open_filter(vf, "scale", NULL); + mp_tmsg(MSGT_DECVIDEO, MSGL_INFO, "Could not find matching colorspace - retrying with -vf scale...\n"); + sc = vf = vf_open_filter(opts, vf, "scale", NULL); goto csp_again; } else if (palette == 1) { mp_msg(MSGT_DECVIDEO, MSGL_V, "vd: Trying -vf palette...\n"); palette = -1; - vf = vf_open_filter(vf, "palette", NULL); + vf = vf_open_filter(opts, vf, "palette", NULL); goto csp_again; - } else { // sws failed, if the last filter (vf_vo) support MPEGPES try to append vf_lavc + } else { + // sws failed, if the last filter (vf_vo) support MPEGPES try + // to append vf_lavc vf_instance_t *vo, *vp = NULL, *ve, *vpp = NULL; // Remove the scale filter if we added it ourselves if (vf == sc) { @@ -247,22 +220,25 @@ int mpcodecs_config_vo(sh_video_t *sh, int w, int h, } if (vo->query_format(vo, IMGFMT_MPEGPES) && (!vp || (vp && strcmp(vp->info->name, "lavc")))) { - ve = vf_open_filter(vo, "lavc", NULL); + ve = vf_open_filter(opts, vo, "lavc", NULL); if (vp) vp->next = ve; else vf = ve; goto csp_again; } - if (vp && !strcmp(vp->info->name, "lavc")) { - if (vpp) + if (vp && !strcmp(vp->info->name,"lavc")) { + if (vpp) vpp->next = vo; - else + else vf = vo; - vf_uninit_filter(vp); + vf_uninit_filter(vp); } } - mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_VOincompCodec); + mp_tmsg(MSGT_CPLAYER, MSGL_WARN, + "The selected video_out device is incompatible with this codec.\n"\ + "Try appending the scale filter to your filter list,\n"\ + "e.g. -vf spp,scale instead of -vf spp.\n"); sh->vf_initialized = -1; return 0; // failed } @@ -273,35 +249,34 @@ int mpcodecs_config_vo(sh_video_t *sh, int w, int h, sh->vfilter = vf; // autodetect flipping - if (flip == -1) { - flip = 0; + if (opts->flip == -1) { + opts->flip = 0; if (sh->codec->outflags[j] & CODECS_FLAG_FLIP) if (!(sh->codec->outflags[j] & CODECS_FLAG_NOFLIP)) - flip = 1; + opts->flip = 1; } - if (vo_flags & VFCAP_FLIPPED) - flip ^= 1; - if (flip && !(vo_flags & VFCAP_FLIP)) { + if (sh->output_flags & VFCAP_FLIPPED) + opts->flip ^= 1; + if (opts->flip && !(sh->output_flags & VFCAP_FLIP)) { // we need to flip, but no flipping filter avail. vf_add_before_vo(&vf, "flip", NULL); sh->vfilter = vf; } // time to do aspect ratio corrections... - if (movie_aspect > -1.0) - sh->aspect = movie_aspect; // cmdline overrides autodetect + if (opts->movie_aspect > -1.0) + sh->aspect = opts->movie_aspect; // cmdline overrides autodetect else if (sh->stream_aspect != 0.0) sh->aspect = sh->stream_aspect; -// if(!sh->aspect) sh->aspect=1.0; - if (opt_screen_size_x || opt_screen_size_y) { - screen_size_x = opt_screen_size_x; - screen_size_y = opt_screen_size_y; - if (!vidmode) { + if (opts->screen_size_x || opts->screen_size_y) { + screen_size_x = opts->screen_size_x; + screen_size_y = opts->screen_size_y; + if (!opts->vidmode) { if (!screen_size_x) - screen_size_x = SCREEN_SIZE_X; + screen_size_x = 1; if (!screen_size_y) - screen_size_y = SCREEN_SIZE_Y; + screen_size_y = 1; if (screen_size_x <= 8) screen_size_x *= sh->disp_w; if (screen_size_y <= 8) @@ -311,41 +286,41 @@ int mpcodecs_config_vo(sh_video_t *sh, int w, int h, // check source format aspect, calculate prescale ::atmos screen_size_x = sh->disp_w; screen_size_y = sh->disp_h; - if (screen_size_xy >= 0.001) { - if (screen_size_xy <= 8) { + if (opts->screen_size_xy >= 0.001) { + if (opts->screen_size_xy <= 8) { // -xy means x+y scale - screen_size_x *= screen_size_xy; - screen_size_y *= screen_size_xy; + screen_size_x *= opts->screen_size_xy; + screen_size_y *= opts->screen_size_xy; } else { // -xy means forced width while keeping correct aspect - screen_size_x = screen_size_xy; - screen_size_y = screen_size_xy * sh->disp_h / sh->disp_w; + screen_size_x = opts->screen_size_xy; + screen_size_y = opts->screen_size_xy * sh->disp_h / sh->disp_w; } } if (sh->aspect > 0.01) { int w; - mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_MovieAspectIsSet, + mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "Movie-Aspect is %.2f:1 - prescaling to correct movie aspect.\n", sh->aspect); mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_ASPECT=%1.4f\n", sh->aspect); w = (int) ((float) screen_size_y * sh->aspect); w += w % 2; // round // we don't like horizontal downscale || user forced width: - if (w < screen_size_x || screen_size_xy > 8) { + if (w < screen_size_x || opts->screen_size_xy > 8) { screen_size_y = (int) ((float) screen_size_x * (1.0 / sh->aspect)); screen_size_y += screen_size_y % 2; // round } else screen_size_x = w; // keep new width } else { - mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_MovieAspectUndefined); + mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "Movie-Aspect is undefined - no prescaling applied.\n"); } } - vocfg_flags = (fullscreen ? VOFLAG_FULLSCREEN : 0) - | (vidmode ? VOFLAG_MODESWITCHING : 0) - | (softzoom ? VOFLAG_SWSCALE : 0) - | (flip ? VOFLAG_FLIPPING : 0); + vocfg_flags = (opts->fullscreen ? VOFLAG_FULLSCREEN : 0) + | (opts->vidmode ? VOFLAG_MODESWITCHING : 0) + | (opts->softzoom ? VOFLAG_SWSCALE : 0) + | (opts->flip ? VOFLAG_FLIPPING : 0); // Time to config libvo! mp_msg(MSGT_CPLAYER, MSGL_V, @@ -358,24 +333,23 @@ int mpcodecs_config_vo(sh_video_t *sh, int w, int h, if (vf_config_wrapper (vf, sh->disp_w, sh->disp_h, screen_size_x, screen_size_y, vocfg_flags, out_fmt) == 0) { -// "MPlayer",out_fmt)){ - mp_msg(MSGT_CPLAYER, MSGL_WARN, MSGTR_CannotInitVO); + mp_tmsg(MSGT_CPLAYER, MSGL_WARN, "FATAL: Cannot initialize video driver.\n"); sh->vf_initialized = -1; return 0; } sh->vf_initialized = 1; - if (vo_gamma_gamma != 1000) - set_video_colors(sh, "gamma", vo_gamma_gamma); - if (vo_gamma_brightness != 1000) - set_video_colors(sh, "brightness", vo_gamma_brightness); - if (vo_gamma_contrast != 1000) - set_video_colors(sh, "contrast", vo_gamma_contrast); - if (vo_gamma_saturation != 1000) - set_video_colors(sh, "saturation", vo_gamma_saturation); - if (vo_gamma_hue != 1000) - set_video_colors(sh, "hue", vo_gamma_hue); + if (opts->vo_gamma_gamma != 1000) + set_video_colors(sh, "gamma", opts->vo_gamma_gamma); + if (opts->vo_gamma_brightness != 1000) + set_video_colors(sh, "brightness", opts->vo_gamma_brightness); + if (opts->vo_gamma_contrast != 1000) + set_video_colors(sh, "contrast", opts->vo_gamma_contrast); + if (opts->vo_gamma_saturation != 1000) + set_video_colors(sh, "saturation", opts->vo_gamma_saturation); + if (opts->vo_gamma_hue != 1000) + set_video_colors(sh, "hue", opts->vo_gamma_hue); return 1; } |