diff options
-rw-r--r-- | audio/decode/dec_audio.c | 10 | ||||
-rw-r--r-- | demux/demux_timeline.c | 7 | ||||
-rw-r--r-- | demux/packet.c | 2 | ||||
-rw-r--r-- | demux/packet.h | 6 | ||||
-rw-r--r-- | sub/dec_sub.c | 2 | ||||
-rw-r--r-- | video/decode/dec_video.c | 11 |
6 files changed, 21 insertions, 17 deletions
diff --git a/audio/decode/dec_audio.c b/audio/decode/dec_audio.c index 387a479a8c..5eca89b1e2 100644 --- a/audio/decode/dec_audio.c +++ b/audio/decode/dec_audio.c @@ -196,6 +196,12 @@ static void fix_audio_pts(struct dec_audio *da) da->pts += mp_aframe_duration(da->current_frame); } +static bool is_new_segment(struct dec_audio *da, struct demux_packet *p) +{ + return p->segmented && + (p->start != da->start || p->end != da->end || p->codec != da->codec); +} + void audio_work(struct dec_audio *da) { if (da->current_frame || !da->ad_driver) @@ -208,7 +214,7 @@ void audio_work(struct dec_audio *da) return; } - if (da->packet && da->packet->new_segment) { + if (da->packet && is_new_segment(da, da->packet)) { assert(!da->new_segment); da->new_segment = da->packet; da->packet = NULL; @@ -260,8 +266,6 @@ void audio_work(struct dec_audio *da) da->start = new_segment->start; da->end = new_segment->end; - new_segment->new_segment = false; - da->packet = new_segment; da->current_state = DATA_AGAIN; } diff --git a/demux/demux_timeline.c b/demux/demux_timeline.c index 76bb106a7d..87cc1ce6d6 100644 --- a/demux/demux_timeline.c +++ b/demux/demux_timeline.c @@ -46,7 +46,6 @@ struct segment { struct virtual_stream { struct sh_stream *sh; // stream exported by demux_timeline bool selected; // ==demux_stream_is_selected(sh) - bool new_segment; // whether a new segment needs to be signaled int eos_packets; // deal with b-frame delay }; @@ -196,7 +195,6 @@ static void switch_segment(struct demuxer *demuxer, struct segment *new, for (int n = 0; n < p->num_streams; n++) { struct virtual_stream *vs = p->streams[n]; - vs->new_segment = true; vs->eos_packets = 0; } @@ -307,10 +305,7 @@ static int d_fill_buffer(struct demuxer *demuxer) } } - if (!p->dash) - pkt->new_segment |= vs->new_segment; - vs->new_segment = false; - + pkt->segmented = true; demux_add_packet(vs->sh, pkt); return 1; diff --git a/demux/packet.c b/demux/packet.c index ee49bd2acb..0a13b0e6a5 100644 --- a/demux/packet.c +++ b/demux/packet.c @@ -109,9 +109,9 @@ void demux_packet_copy_attribs(struct demux_packet *dst, struct demux_packet *sr dst->dts = src->dts; dst->duration = src->duration; dst->pos = src->pos; + dst->segmented = src->segmented; dst->start = src->start; dst->end = src->end; - dst->new_segment = src->new_segment; dst->codec = src->codec; dst->keyframe = src->keyframe; dst->stream = src->stream; diff --git a/demux/packet.h b/demux/packet.h index 884a7d8eab..866a27dfb5 100644 --- a/demux/packet.h +++ b/demux/packet.h @@ -36,9 +36,9 @@ typedef struct demux_packet { int stream; // source stream index // segmentation (ordered chapters, EDL) - struct mp_codec_params *codec; - double start, end; - bool new_segment; + bool segmented; + struct mp_codec_params *codec; // set to non-NULL iff segmented is set + double start, end; // set to non-NOPTS iff segmented is set // private struct demux_packet *next; diff --git a/sub/dec_sub.c b/sub/dec_sub.c index 743a06ed14..11ab879211 100644 --- a/sub/dec_sub.c +++ b/sub/dec_sub.c @@ -203,7 +203,7 @@ void sub_preload(struct dec_sub *sub) static bool is_new_segment(struct dec_sub *sub, struct demux_packet *p) { - return p->new_segment && + return p->segmented && (p->start != sub->start || p->end != sub->end || p->codec != sub->codec); } diff --git a/video/decode/dec_video.c b/video/decode/dec_video.c index a78203b49a..67c5eaccd7 100644 --- a/video/decode/dec_video.c +++ b/video/decode/dec_video.c @@ -390,6 +390,13 @@ void video_set_start(struct dec_video *d_video, double start_pts) d_video->start_pts = start_pts; } +static bool is_new_segment(struct dec_video *d_video, struct demux_packet *p) +{ + return p->segmented && + (p->start != d_video->start || p->end != d_video->end || + p->codec != d_video->codec); +} + void video_work(struct dec_video *d_video) { if (d_video->current_mpi || !d_video->vd_driver) @@ -402,7 +409,7 @@ void video_work(struct dec_video *d_video) return; } - if (d_video->packet && d_video->packet->new_segment) { + if (d_video->packet && is_new_segment(d_video, d_video->packet)) { assert(!d_video->new_segment); d_video->new_segment = d_video->packet; d_video->packet = NULL; @@ -472,8 +479,6 @@ void video_work(struct dec_video *d_video) d_video->start = new_segment->start; d_video->end = new_segment->end; - new_segment->new_segment = false; - d_video->packet = new_segment; d_video->current_state = DATA_AGAIN; } |