vlc | branch: master | Francois Cartegnie <[email protected]> | Tue Sep 5 15:15:56 2017 +0200| [079eaa8cb024fabbc38168b9ad7bb5abb4e0de7b] | committer: Francois Cartegnie
access: rtp: handle drops for discontinuity propagation > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=079eaa8cb024fabbc38168b9ad7bb5abb4e0de7b --- modules/access/rtp/rtp.c | 20 +++++++++++--------- modules/access/rtp/rtp.h | 6 +++--- modules/access/rtp/session.c | 15 ++++++++++++--- modules/access/rtp/xiph.c | 12 ++++++++---- 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/modules/access/rtp/rtp.c b/modules/access/rtp/rtp.c index 5fa7086f93..32ae0909da 100644 --- a/modules/access/rtp/rtp.c +++ b/modules/access/rtp/rtp.c @@ -438,7 +438,7 @@ void codec_destroy (demux_t *demux, void *data) } /* Send a packet to decoder */ -void codec_decode (demux_t *demux, void *data, block_t *block) +bool codec_decode (demux_t *demux, void *data, block_t *block) { if (data) { @@ -448,6 +448,7 @@ void codec_decode (demux_t *demux, void *data, block_t *block) } else block_Release (block); + return !!data; } static void *stream_init (demux_t *demux, const char *name) @@ -473,13 +474,14 @@ static void stream_destroy (demux_t *demux, void *data) } /* Send a packet to a chained demuxer */ -static void stream_decode (demux_t *demux, void *data, block_t *block) +static bool stream_decode (demux_t *demux, void *data, block_t *block) { + VLC_UNUSED(demux); if (data) vlc_demux_chained_Send(data, block); else block_Release (block); - (void)demux; + return !!data; } static void *demux_init (demux_t *demux) @@ -579,18 +581,18 @@ static void *mpa_init (demux_t *demux) return codec_init (demux, &fmt); } -static void mpa_decode (demux_t *demux, void *data, block_t *block) +static bool mpa_decode (demux_t *demux, void *data, block_t *block) { if (block->i_buffer < 4) { block_Release (block); - return; + return false; } block->i_buffer -= 4; /* 32-bits RTP/MPA header */ block->p_buffer += 4; - codec_decode (demux, data, block); + return codec_decode (demux, data, block); } @@ -606,12 +608,12 @@ static void *mpv_init (demux_t *demux) return codec_init (demux, &fmt); } -static void mpv_decode (demux_t *demux, void *data, block_t *block) +static bool mpv_decode (demux_t *demux, void *data, block_t *block) { if (block->i_buffer < 4) { block_Release (block); - return; + return false; } block->i_buffer -= 4; /* 32-bits RTP/MPV header */ @@ -623,7 +625,7 @@ static void mpv_decode (demux_t *demux, void *data, block_t *block) /* TODO: shouldn't we skip this too ? */ } #endif - codec_decode (demux, data, block); + return codec_decode (demux, data, block); } diff --git a/modules/access/rtp/rtp.h b/modules/access/rtp/rtp.h index dd6d802960..ae681fa390 100644 --- a/modules/access/rtp/rtp.h +++ b/modules/access/rtp/rtp.h @@ -30,7 +30,7 @@ struct rtp_pt_t { void *(*init) (demux_t *); void (*destroy) (demux_t *, void *); - void (*decode) (demux_t *, void *, block_t *); + bool (*decode) (demux_t *, void *, block_t *); uint32_t frequency; /* RTP clock rate (Hz) */ uint8_t number; }; @@ -43,11 +43,11 @@ static inline uint8_t rtp_ptype (const block_t *block) void *codec_init (demux_t *demux, es_format_t *fmt); void codec_destroy (demux_t *demux, void *data); -void codec_decode (demux_t *demux, void *data, block_t *block); +bool codec_decode (demux_t *demux, void *data, block_t *block); void *theora_init (demux_t *demux); void xiph_destroy (demux_t *demux, void *data); -void xiph_decode (demux_t *demux, void *data, block_t *block); +bool xiph_decode (demux_t *demux, void *data, block_t *block); /** @section RTP session */ rtp_session_t *rtp_session_create (demux_t *); diff --git a/modules/access/rtp/session.c b/modules/access/rtp/session.c index 0c26d34675..d0243e3d09 100644 --- a/modules/access/rtp/session.c +++ b/modules/access/rtp/session.c @@ -96,10 +96,11 @@ static void no_destroy (demux_t *demux, void *opaque) (void)demux; (void)opaque; } -static void no_decode (demux_t *demux, void *opaque, block_t *block) +static bool no_decode (demux_t *demux, void *opaque, block_t *block) { (void)demux; (void)opaque; block_Release (block); + return true; } /** @@ -149,6 +150,8 @@ struct rtp_source_t uint16_t last_seq; /* sequence of the next dequeued packet */ block_t *blocks; /* re-ordered blocks queue */ + bool discontinuity; + void *opaque[]; /* Per-source private payload data */ }; @@ -173,6 +176,7 @@ rtp_source_create (demux_t *demux, const rtp_session_t *session, source->max_seq = source->bad_seq = init_seq; source->last_seq = init_seq - 1; source->blocks = NULL; + source->discontinuity = false; /* Initializes all payload */ for (unsigned i = 0; i < session->ptc; i++) @@ -493,6 +497,7 @@ rtp_decode (demux_t *demux, const rtp_session_t *session, rtp_source_t *src) uint16_t delta_seq = rtp_seq (block) - (src->last_seq + 1); if (delta_seq != 0) { + src->discontinuity = true; if (delta_seq >= 0x8000) { /* Trash too late packets (and PIM Assert duplicates) */ msg_Dbg (demux, "ignoring late packet (sequence: %"PRIu16")", @@ -500,7 +505,6 @@ rtp_decode (demux_t *demux, const rtp_session_t *session, rtp_source_t *src) goto drop; } msg_Warn (demux, "%"PRIu16" packet(s) lost", delta_seq); - block->i_flags |= BLOCK_FLAG_DISCONTINUITY; } src->last_seq = rtp_seq (block); @@ -544,7 +548,12 @@ rtp_decode (demux_t *demux, const rtp_session_t *session, rtp_source_t *src) block->p_buffer += skip; block->i_buffer -= skip; - pt->decode (demux, pt_data, block); + if(src->discontinuity) + block->i_flags |= BLOCK_FLAG_DISCONTINUITY; + + if (pt->decode (demux, pt_data, block)) + src->discontinuity = false; + return; drop: diff --git a/modules/access/rtp/xiph.c b/modules/access/rtp/xiph.c index 8cdfcd4a57..84ec6f1314 100644 --- a/modules/access/rtp/xiph.c +++ b/modules/access/rtp/xiph.c @@ -143,9 +143,10 @@ static ssize_t xiph_header (void **pextra, const uint8_t *buf, size_t len) } -void xiph_decode (demux_t *demux, void *data, block_t *block) +bool xiph_decode (demux_t *demux, void *data, block_t *block) { rtp_xiph_t *self = data; + bool ret = false; if (!data || block->i_buffer < 4) goto drop; @@ -205,14 +206,14 @@ void xiph_decode (demux_t *demux, void *data, block_t *block) if (!self->block) { block_Release (block); - return; + return ret; } memcpy (self->block->p_buffer + len, block->p_buffer + 2, fraglen); block_Release (block); } if (fragtype < 3) - return; /* Non-last fragment */ + return ret; /* Non-last fragment */ /* Last fragment reached, process it */ block = self->block; @@ -247,7 +248,8 @@ void xiph_decode (demux_t *demux, void *data, block_t *block) block_t *raw = block_Alloc (len); memcpy (raw->p_buffer, block->p_buffer, len); raw->i_pts = block->i_pts; /* FIXME: what about pkts > 1 */ - codec_decode (demux, self->id, raw); + raw->i_flags |= (block->i_flags & BLOCK_FLAG_DISCONTINUITY); + ret |= codec_decode (demux, self->id, raw); break; } @@ -274,6 +276,7 @@ void xiph_decode (demux_t *demux, void *data, block_t *block) ident); self->ident = ident; self->id = codec_init (demux, &fmt); + ret = true; break; } } @@ -285,4 +288,5 @@ void xiph_decode (demux_t *demux, void *data, block_t *block) drop: block_Release (block); + return ret; } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
