summaryrefslogtreecommitdiff
path: root/libavcodec/dvbsubdec.c
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2010-07-14 17:28:40 +0000
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2010-07-14 17:28:40 +0000
commitb834becdaed1019d926a957628ecd54a69694cb4 (patch)
tree29a756356d15ebb46d368251a9b4197f6a2e3228 /libavcodec/dvbsubdec.c
parentbd7d08e27e54031a2614b800924fa4bee7ef858b (diff)
Pass the composition and ancillary ID for DVB subtitles via extradata instead
of sub_id, this allows detecting when that information is not available and just decode everything. In addition extradata is required for many codecs and thus in contrast to sub_id generally already passed on by any programs using libav*. Also ask for a sample if we encounter a stream with multiple/changing IDs. Originally committed as revision 24238 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/dvbsubdec.c')
-rw-r--r--libavcodec/dvbsubdec.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/libavcodec/dvbsubdec.c b/libavcodec/dvbsubdec.c
index d1d01fd13d..3e06260398 100644
--- a/libavcodec/dvbsubdec.c
+++ b/libavcodec/dvbsubdec.c
@@ -358,8 +358,14 @@ static av_cold int dvbsub_init_decoder(AVCodecContext *avctx)
int i, r, g, b, a = 0;
DVBSubContext *ctx = avctx->priv_data;
- ctx->composition_id = avctx->sub_id & 0xffff;
- ctx->ancillary_id = avctx->sub_id >> 16;
+ if (!avctx->extradata || avctx->extradata_size != 4) {
+ av_log(avctx, AV_LOG_WARNING, "Invalid extradata, subtitle streams may be combined!\n");
+ ctx->composition_id = -1;
+ ctx->ancillary_id = -1;
+ } else {
+ ctx->composition_id = AV_RB16(avctx->extradata);
+ ctx->ancillary_id = AV_RB16(avctx->extradata + 2);
+ }
default_clut.id = -1;
default_clut.next = NULL;
@@ -1434,7 +1440,8 @@ static int dvbsub_decode(AVCodecContext *avctx,
segment_length = AV_RB16(p);
p += 2;
- if (page_id == ctx->composition_id || page_id == ctx->ancillary_id) {
+ if (page_id == ctx->composition_id || page_id == ctx->ancillary_id ||
+ ctx->composition_id == -1 || ctx->ancillary_id == -1) {
switch (segment_type) {
case DVBSUB_PAGE_SEGMENT:
dvbsub_parse_page_segment(avctx, p, segment_length);