summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
authorAman Gupta <aman@tmm1.net>2015-12-21 17:35:15 -0800
committerAman Gupta <aman@tmm1.net>2016-01-18 12:14:52 -0800
commitf9cefbfec4d7bfec44991d4372aad4fc1b3167a5 (patch)
tree1b74ac9e3d9dc978906636c7b2335b0cd3151570 /demux
parented3e5330ec1f201895c90f73a0c099a75241b404 (diff)
downloadmpv-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.c25
-rw-r--r--demux/demux.h1
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);