From c676c31815b5c8bd9ba6eab968bbc0862eaa4bba Mon Sep 17 00:00:00 2001 From: Niklas Haas Date: Tue, 8 Nov 2016 17:53:55 +0100 Subject: demux: expose demuxer colorimetry metadata to player Implementation-wise, the values from the demuxer/codec header are merged with the values from the decoder such that the former are used only where the latter are unknown (0/auto). --- demux/demux_mkv.c | 1 + demux/stheader.h | 2 ++ video/csputils.c | 16 ++++++++++++++++ video/csputils.h | 3 +++ video/decode/dec_video.c | 1 + 5 files changed, 23 insertions(+) diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index bf7a8e2d91..63b58cdb15 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -1436,6 +1436,7 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track) sh_v->par_h = p.p_h; sh_v->stereo_mode = track->stereo_mode; + sh_v->color = track->color; done: demux_add_sh_stream(demuxer, sh); diff --git a/demux/stheader.h b/demux/stheader.h index 8dcd8351a6..240be72a46 100644 --- a/demux/stheader.h +++ b/demux/stheader.h @@ -22,6 +22,7 @@ #include "common/common.h" #include "audio/chmap.h" +#include "video/csputils.h" struct MPOpts; struct demuxer; @@ -93,6 +94,7 @@ struct mp_codec_params { int disp_w, disp_h; // display size int rotate; // intended display rotation, in degrees, [0, 359] int stereo_mode; // mp_stereo3d_mode (0 if none/unknown) + struct mp_colorspace color; // colorspace info where available // STREAM_VIDEO + STREAM_AUDIO int bits_per_coded_sample; diff --git a/video/csputils.c b/video/csputils.c index 0c2e847186..8f6a9e351e 100644 --- a/video/csputils.c +++ b/video/csputils.c @@ -100,6 +100,22 @@ const struct m_opt_choice_alternatives mp_chroma_names[] = { {0} }; +void mp_colorspace_merge(struct mp_colorspace *orig, struct mp_colorspace *new) +{ + if (!orig->space) + orig->space = new->space; + if (!orig->levels) + orig->levels = new->levels; + if (!orig->primaries) + orig->primaries = new->primaries; + if (!orig->gamma) + orig->gamma = new->gamma; + if (!orig->nom_peak) + orig->nom_peak = new->nom_peak; + if (!orig->sig_peak) + orig->sig_peak = new->sig_peak; +} + // The short name _must_ match with what vf_stereo3d accepts (if supported). // The long name in comments is closer to the Matroska spec (StereoMode element). // The numeric index matches the Matroska StereoMode value. If you add entries diff --git a/video/csputils.h b/video/csputils.h index 0406ddf35f..9eaafbe75d 100644 --- a/video/csputils.h +++ b/video/csputils.h @@ -125,6 +125,9 @@ struct mp_colorspace { float sig_peak; // signal peak, highest value that occurs in the source }; +// Replaces unknown values in the first struct by those of the second struct +void mp_colorspace_merge(struct mp_colorspace *orig, struct mp_colorspace *new); + struct mp_csp_params { struct mp_colorspace color; // input colorspace enum mp_csp_levels levels_out; // output device diff --git a/video/decode/dec_video.c b/video/decode/dec_video.c index 7e144a72bc..0dc51943bc 100644 --- a/video/decode/dec_video.c +++ b/video/decode/dec_video.c @@ -245,6 +245,7 @@ static void fix_image_params(struct dec_video *d_video, p.stereo_out = opts->video_stereo_mode; // Detect colorspace from resolution. + mp_colorspace_merge(&p.color, &c->color); mp_image_params_guess_csp(&p); d_video->last_format = *params; -- cgit v1.2.3