summaryrefslogtreecommitdiffstats
path: root/video/decode/dec_video.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-11-23 21:28:28 +0100
committerwm4 <wm4@nowhere>2013-11-23 21:28:28 +0100
commitacfeb869a38d7f7a4e5bb273082e9cc63a02b15a (patch)
tree0a292b527d546780dc8391dde07ce6a70c3f6635 /video/decode/dec_video.c
parent4fa2babacc290b94bed0938658447205c0545e27 (diff)
downloadmpv-acfeb869a38d7f7a4e5bb273082e9cc63a02b15a.tar.bz2
mpv-acfeb869a38d7f7a4e5bb273082e9cc63a02b15a.tar.xz
video: merge vd.c into dec_video.c
I don't feel like the separation ever made sense, and it was hard to tell which file a function you were looking for was in.
Diffstat (limited to 'video/decode/dec_video.c')
-rw-r--r--video/decode/dec_video.c138
1 files changed, 138 insertions, 0 deletions
diff --git a/video/decode/dec_video.c b/video/decode/dec_video.c
index 6ab67b9dad..f534a427de 100644
--- a/video/decode/dec_video.c
+++ b/video/decode/dec_video.c
@@ -42,6 +42,19 @@
#include "video/decode/dec_video.h"
+extern const vd_functions_t mpcodecs_vd_ffmpeg;
+
+/* Please do not add any new decoders here. If you want to implement a new
+ * decoder, add it to libavcodec, except for wrappers around external
+ * libraries and decoders requiring binary support. */
+
+const vd_functions_t * const mpcodecs_vd_drivers[] = {
+ &mpcodecs_vd_ffmpeg,
+ /* Please do not add any new decoders here. If you want to implement a new
+ * decoder, add it to libavcodec, except for wrappers around external
+ * libraries and decoders requiring binary support. */
+ NULL
+};
int vd_control(struct sh_video *sh_video, int cmd, void *arg)
{
@@ -292,3 +305,128 @@ void *decode_video(sh_video_t *sh_video, struct demux_packet *packet,
sh_video->num_sorted_pts_problems++;
return mpi;
}
+
+int mpcodecs_reconfig_vo(sh_video_t *sh, const struct mp_image_params *params)
+{
+ struct MPOpts *opts = sh->opts;
+ vf_instance_t *vf = sh->vfilter;
+ int vocfg_flags = 0;
+ struct mp_image_params p = *params;
+
+ sh->vf_reconfig_count++;
+
+ mp_msg(MSGT_DECVIDEO, MSGL_V,
+ "VIDEO: %dx%d %5.3f fps %5.1f kbps (%4.1f kB/s)\n",
+ p.w, p.h, sh->fps, sh->i_bps * 0.008,
+ sh->i_bps / 1000.0);
+
+ mp_msg(MSGT_DECVIDEO, MSGL_V, "VDec: vo config request - %d x %d (%s)\n",
+ p.w, p.h, vo_format_name(p.imgfmt));
+
+ if (get_video_quality_max(sh) <= 0 && opts->divx_quality) {
+ // user wants postprocess but no pp filter yet:
+ sh->vfilter = vf = vf_open_filter(opts, vf, "pp", NULL);
+ }
+
+ // check if libvo and codec has common outfmt (no conversion):
+ int flags = 0;
+ for (;;) {
+ mp_msg(MSGT_VFILTER, MSGL_V, "Trying filter chain:\n");
+ vf_print_filter_chain(MSGL_V, vf);
+
+ flags = vf->query_format(vf, p.imgfmt);
+ mp_msg(MSGT_CPLAYER, MSGL_DBG2, "vo_debug: query(%s) returned 0x%X \n",
+ vo_format_name(p.imgfmt), flags);
+ if ((flags & VFCAP_CSP_SUPPORTED_BY_HW)
+ || (flags & VFCAP_CSP_SUPPORTED))
+ {
+ break;
+ }
+ // TODO: no match - we should use conversion...
+ if (strcmp(vf->info->name, "scale")) {
+ mp_tmsg(MSGT_DECVIDEO, MSGL_INFO, "Could not find matching colorspace - retrying with -vf scale...\n");
+ vf = vf_open_filter(opts, vf, "scale", NULL);
+ continue;
+ }
+ 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 filter,scale instead of -vf filter.\n");
+ mp_tmsg(MSGT_VFILTER, MSGL_WARN, "Attempted filter chain:\n");
+ vf_print_filter_chain(MSGL_WARN, vf);
+ sh->vf_initialized = -1;
+ return -1; // failed
+ }
+ sh->vfilter = vf;
+
+ // autodetect flipping
+ bool flip = opts->flip;
+ if (flip && !(flags & VFCAP_FLIP)) {
+ // we need to flip, but no flipping filter avail.
+ vf_add_before_vo(&vf, "flip", NULL);
+ sh->vfilter = vf;
+ flip = false;
+ }
+ // time to do aspect ratio corrections...
+
+ float force_aspect = opts->movie_aspect;
+ if (force_aspect > -1.0 && sh->stream_aspect != 0.0)
+ force_aspect = sh->stream_aspect;
+
+ if (force_aspect >= 0)
+ vf_set_dar(&p.d_w, &p.d_h, p.w, p.h, force_aspect);
+
+ if (abs(p.d_w - p.w) >= 4 || abs(p.d_h - p.h) >= 4) {
+ mp_tmsg(MSGT_CPLAYER, MSGL_V, "Aspect ratio is %.2f:1 - "
+ "scaling to correct movie aspect.\n", sh->aspect);
+ mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_ASPECT=%1.4f\n", sh->aspect);
+ } else {
+ p.d_w = p.w;
+ p.d_h = p.h;
+ }
+
+ // Apply user overrides
+ if (opts->requested_colorspace != MP_CSP_AUTO)
+ p.colorspace = opts->requested_colorspace;
+ if (opts->requested_input_range != MP_CSP_LEVELS_AUTO)
+ p.colorlevels = opts->requested_input_range;
+ p.outputlevels = opts->requested_output_range;
+
+ // Detect colorspace from resolution.
+ // Make sure the user-overrides are consistent (no RGB csp for YUV, etc.).
+ mp_image_params_guess_csp(&p);
+
+ vocfg_flags = (flip ? VOFLAG_FLIPPING : 0);
+
+ // Time to config libvo!
+ mp_msg(MSGT_CPLAYER, MSGL_V, "VO Config (%dx%d->%dx%d,flags=%d,0x%X)\n",
+ p.w, p.h, p.d_w, p.d_h, vocfg_flags, p.imgfmt);
+
+ if (vf_reconfig_wrapper(vf, &p, vocfg_flags) < 0) {
+ mp_tmsg(MSGT_CPLAYER, MSGL_WARN, "FATAL: Cannot initialize video driver.\n");
+ sh->vf_initialized = -1;
+ return -1;
+ }
+
+ mp_tmsg(MSGT_VFILTER, MSGL_V, "Video filter chain:\n");
+ vf_print_filter_chain(MSGL_V, vf);
+
+ sh->vf_initialized = 1;
+
+ if (!sh->vf_input)
+ sh->vf_input = talloc(sh, struct mp_image_params);
+ *sh->vf_input = p;
+
+ if (opts->gamma_gamma != 1000)
+ set_video_colors(sh, "gamma", opts->gamma_gamma);
+ if (opts->gamma_brightness != 1000)
+ set_video_colors(sh, "brightness", opts->gamma_brightness);
+ if (opts->gamma_contrast != 1000)
+ set_video_colors(sh, "contrast", opts->gamma_contrast);
+ if (opts->gamma_saturation != 1000)
+ set_video_colors(sh, "saturation", opts->gamma_saturation);
+ if (opts->gamma_hue != 1000)
+ set_video_colors(sh, "hue", opts->gamma_hue);
+
+ return 0;
+}