summaryrefslogtreecommitdiff
path: root/libavformat
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 /libavformat
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 'libavformat')
-rw-r--r--libavformat/mpegts.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index d9ee987e1d..b1600901e2 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -860,7 +860,6 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
const uint8_t *p, *p_end, *desc_list_end, *desc_end;
int program_info_length, pcr_pid, pid, stream_type;
int desc_list_len, desc_len, desc_tag;
- int comp_page, anc_page;
char language[4];
uint32_t prog_reg_desc = 0; /* registration descriptor */
@@ -981,9 +980,17 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
language[2] = get8(&p, desc_end);
language[3] = 0;
get8(&p, desc_end);
- comp_page = get16(&p, desc_end);
- anc_page = get16(&p, desc_end);
- st->codec->sub_id = (anc_page << 16) | comp_page;
+ if (st->codec->extradata) {
+ if (st->codec->extradata_size == 4 && memcmp(st->codec->extradata, p, 4))
+ av_log_ask_for_sample(ts->stream, "DVB sub with multiple IDs\n");
+ } else {
+ st->codec->extradata = av_malloc(4 + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (st->codec->extradata) {
+ st->codec->extradata_size = 4;
+ memcpy(st->codec->extradata, p, 4);
+ }
+ }
+ p += 4;
av_metadata_set2(&st->metadata, "language", language, 0);
break;
case 0x0a: /* ISO 639 language descriptor */