diff --git a/libavformat/rdt.c b/libavformat/rdt.c index 645b5806cd..3050a91c9c 100644 --- a/libavformat/rdt.c +++ b/libavformat/rdt.c @@ -37,7 +37,13 @@ struct RDTDemuxContext { AVFormatContext *ic; /**< the containing (RTSP) demux context */ - AVStream *st; + /** Each RDT stream-set (represented by one RTSPStream) can contain + * multiple streams (of the same content, but with possibly different + * codecs/bitrates). Each such stream is represented by one AVStream + * in the AVFormatContext, and this variable points to the offset in + * that array such that the first is the first stream of this set. */ + AVStream **streams; + int n_streams; /**< streams with identifical content in this set */ void *dynamic_protocol_context; DynamicPayloadPacketHandlerProc parse_packet; uint32_t prev_timestamp; @@ -53,7 +59,11 @@ ff_rdt_parse_open(AVFormatContext *ic, int first_stream_of_set_idx, return NULL; s->ic = ic; - s->st = ic->streams[first_stream_of_set_idx]; + s->streams = &ic->streams[first_stream_of_set_idx]; + do { + s->n_streams++; + } while (first_stream_of_set_idx + s->n_streams < ic->nb_streams && + s->streams[s->n_streams]->priv_data == s->streams[0]->priv_data); s->prev_set_id = -1; s->prev_timestamp = -1; s->parse_packet = handler->parse_packet; @@ -328,7 +338,7 @@ ff_rdt_parse_packet(RDTDemuxContext *s, AVPacket *pkt, /* return the next packets, if any */ timestamp= 0; ///< Should not be used if buf is NULL, but should be set to the timestamp of the packet returned.... rv= s->parse_packet(s->dynamic_protocol_context, - s->st, pkt, ×tamp, NULL, 0, flags); + s->streams[0], pkt, ×tamp, NULL, 0, flags); return rv; } @@ -346,7 +356,7 @@ ff_rdt_parse_packet(RDTDemuxContext *s, AVPacket *pkt, len -= rv; rv = s->parse_packet(s->dynamic_protocol_context, - s->st, pkt, ×tamp, buf, len, flags); + s->streams[0], pkt, ×tamp, buf, len, flags); return rv; } @@ -365,7 +375,7 @@ ff_rdt_subscribe_rule2 (RDTDemuxContext *s, char *cmd, int size, { PayloadContext *rdt = s->dynamic_protocol_context; - rdt_load_mdpr(rdt, s->st, rule_nr * 2); + rdt_load_mdpr(rdt, s->streams[0], rule_nr * 2); } static unsigned char *