diff options
author | Martin Herkt <lachs0r@srsfckn.biz> | 2016-11-20 18:15:08 +0100 |
---|---|---|
committer | Martin Herkt <lachs0r@srsfckn.biz> | 2016-11-20 18:15:08 +0100 |
commit | 8700700de8a4103724796077034f7f254ad974bc (patch) | |
tree | 2fce4dee518a202c45c3f16567db36edc92ed914 /video/decode/dec_video.c | |
parent | e6b85c91700bee0ddc92e98a30d5021691bd6f65 (diff) | |
parent | eafc273d2c2ae6d247d741202e58ca23dc938cb2 (diff) | |
download | mpv-8700700de8a4103724796077034f7f254ad974bc.tar.bz2 mpv-8700700de8a4103724796077034f7f254ad974bc.tar.xz |
Merge branch 'master' into release/current
Diffstat (limited to 'video/decode/dec_video.c')
-rw-r--r-- | video/decode/dec_video.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/video/decode/dec_video.c b/video/decode/dec_video.c index 7e144a72bc..dea5b594c7 100644 --- a/video/decode/dec_video.c +++ b/video/decode/dec_video.c @@ -64,6 +64,7 @@ void video_reset(struct dec_video *d_video) d_video->decoded_pts = MP_NOPTS_VALUE; d_video->codec_pts = MP_NOPTS_VALUE; d_video->codec_dts = MP_NOPTS_VALUE; + d_video->has_broken_decoded_pts = 0; d_video->last_format = d_video->fixed_format = (struct mp_image_params){0}; d_video->dropped_frames = 0; d_video->current_state = DATA_AGAIN; @@ -245,6 +246,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; @@ -316,8 +318,14 @@ static struct mp_image *decode_packet(struct dec_video *d_video, pts = dts; if (!opts->correct_pts || pts == MP_NOPTS_VALUE) { - if (opts->correct_pts && !d_video->header->missing_timestamps) - MP_WARN(d_video, "No video PTS! Making something up.\n"); + if (opts->correct_pts && !d_video->header->missing_timestamps) { + if (d_video->has_broken_decoded_pts <= 1) { + MP_WARN(d_video, "No video PTS! Making something up.\n"); + if (d_video->has_broken_decoded_pts == 1) + MP_WARN(d_video, "Ignoring further missing PTS warnings.\n"); + d_video->has_broken_decoded_pts++; + } + } double frame_time = 1.0f / (d_video->fps > 0 ? d_video->fps : 25); double base = d_video->first_packet_pdts; @@ -458,12 +466,15 @@ void video_work(struct dec_video *d_video) struct demux_packet *new_segment = d_video->new_segment; d_video->new_segment = NULL; - // Could avoid decoder reinit; would still need flush. - d_video->codec = new_segment->codec; - if (d_video->vd_driver) - d_video->vd_driver->uninit(d_video); - d_video->vd_driver = NULL; - video_init_best_codec(d_video); + if (d_video->codec == new_segment->codec) { + video_reset(d_video); + } else { + d_video->codec = new_segment->codec; + if (d_video->vd_driver) + d_video->vd_driver->uninit(d_video); + d_video->vd_driver = NULL; + video_init_best_codec(d_video); + } d_video->start = new_segment->start; d_video->end = new_segment->end; |