diff options
author | Aman Gupta <aman@tmm1.net> | 2015-12-21 17:35:15 -0800 |
---|---|---|
committer | Aman Gupta <aman@tmm1.net> | 2016-01-18 12:14:52 -0800 |
commit | f9cefbfec4d7bfec44991d4372aad4fc1b3167a5 (patch) | |
tree | 1b74ac9e3d9dc978906636c7b2335b0cd3151570 /demux | |
parent | ed3e5330ec1f201895c90f73a0c099a75241b404 (diff) | |
download | mpv-f9cefbfec4d7bfec44991d4372aad4fc1b3167a5.tar.bz2 mpv-f9cefbfec4d7bfec44991d4372aad4fc1b3167a5.tar.xz |
vd_lavc: feed A53_CC side data packets into the demuxer for eia_608 decoding
Diffstat (limited to 'demux')
-rw-r--r-- | demux/demux.c | 25 | ||||
-rw-r--r-- | demux/demux.h | 1 |
2 files changed, 26 insertions, 0 deletions
diff --git a/demux/demux.c b/demux/demux.c index e286bf0e32..af0a93c03d 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -160,6 +160,10 @@ struct demux_stream { int64_t last_pos; struct demux_packet *head; struct demux_packet *tail; + + // for closed captions (demuxer_feed_caption) + struct sh_stream *cc; + }; // Return "a", or if that is NOPTS, return "def". @@ -361,6 +365,27 @@ const char *stream_type_name(enum stream_type type) } } +void demuxer_feed_caption(struct sh_stream *stream, demux_packet_t *dp) +{ + struct demuxer *demuxer = stream->ds->in->d_thread; + struct sh_stream *sh = stream->ds->cc; + + if (!sh) { + sh = demux_alloc_sh_stream(STREAM_SUB); + if (!sh) + return; + sh->codec->codec = "eia_608"; + stream->ds->cc = sh; + demux_add_sh_stream(demuxer, sh); + } + + if (demux_stream_is_selected(sh)) { + dp->pts = MP_ADD_PTS(dp->pts, -stream->ds->in->ts_offset); + dp->dts = MP_ADD_PTS(dp->dts, -stream->ds->in->ts_offset); + demux_add_packet(sh, dp); + } +} + void demux_add_packet(struct sh_stream *stream, demux_packet_t *dp) { struct demux_stream *ds = stream ? stream->ds : NULL; diff --git a/demux/demux.h b/demux/demux.h index 33cbe0f3b1..72ed15888b 100644 --- a/demux/demux.h +++ b/demux/demux.h @@ -237,6 +237,7 @@ void free_demuxer(struct demuxer *demuxer); void free_demuxer_and_stream(struct demuxer *demuxer); void demux_add_packet(struct sh_stream *stream, demux_packet_t *dp); +void demuxer_feed_caption(struct sh_stream *stream, demux_packet_t *dp); struct demux_packet *demux_read_packet(struct sh_stream *sh); int demux_read_packet_async(struct sh_stream *sh, struct demux_packet **out_pkt); |