diff options
author | Petri Hintukainen <phintuka@users.sourceforge.net> | 2014-08-29 14:15:13 +0300 |
---|---|---|
committer | Petri Hintukainen <phintuka@users.sourceforge.net> | 2014-08-29 14:15:13 +0300 |
commit | 0c01db2db4a49a363934b364bf210be1769e5aeb (patch) | |
tree | e7299dc7c5a2a79bd54bd91f771b5f81ec2a4580 | |
parent | 627fa066185c1a7cda467b9ceaf0c78c44dbc32a (diff) | |
download | xine-lib-0c01db2db4a49a363934b364bf210be1769e5aeb.tar.gz xine-lib-0c01db2db4a49a363934b364bf210be1769e5aeb.tar.bz2 |
matroska: add support for compressed HDMV PGS subtitles
-rw-r--r-- | src/demuxers/demux_matroska.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/demuxers/demux_matroska.c b/src/demuxers/demux_matroska.c index 0ab93eda8..d586b1ac9 100644 --- a/src/demuxers/demux_matroska.c +++ b/src/demuxers/demux_matroska.c @@ -1106,6 +1106,31 @@ static void handle_vobsub (demux_plugin_t *this_gen, matroska_track_t *track, free(new_data); } +static void handle_hdmv_pgs (demux_plugin_t *this_gen, matroska_track_t *track, + int decoder_flags, + uint8_t *data, size_t data_len, + int64_t data_pts, int data_duration, + int input_normpos, int input_time) { + demux_matroska_t *this = (demux_matroska_t *) this_gen; + uint8_t *new_data = NULL; + size_t new_data_len = 0; + + if (track->compress_algo == MATROSKA_COMPRESS_ZLIB) { + uncompress_zlib(this, data, data_len, &new_data, &new_data_len); + if (!new_data) + return; + data = new_data; + data_len = new_data_len; + } + + _x_demux_send_data(track->fifo, data, data_len, + data_pts, track->buf_type, decoder_flags, + input_normpos, input_time, + 0, 0); + + free(new_data); +} + static void fill_extra_data(matroska_track_t *track, uint32_t fourcc) { xine_bmiheader *bih; @@ -1512,6 +1537,7 @@ static int parse_track_entry(demux_matroska_t *this, matroska_track_t *track) { } else if (!strcmp(track->codec_id, MATROSKA_CODEC_ID_S_HDMV_PGS)) { lprintf("MATROSKA_CODEC_ID_S_HDMV_PGS\n"); track->buf_type = BUF_SPU_HDMV; + track->handle_content = handle_hdmv_pgs; init_codec = init_codec_spu; } else { xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG, "unknown codec %s\n", track->codec_id); |