summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audio/decode/dec_audio.c10
-rw-r--r--demux/demux_timeline.c7
-rw-r--r--demux/packet.c2
-rw-r--r--demux/packet.h6
-rw-r--r--sub/dec_sub.c2
-rw-r--r--video/decode/dec_video.c11
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;
}