From 114732f4c72a854a3e4409d01ff0e8eb1fb2c20d Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Sat, 15 Nov 2008 20:41:59 +0000 Subject: [PATCH] Add is_keyframe param to ff_rdt_parse_header(). See ML discussion in "[PATCH] RDT/Realmedia patches #2" thread. Originally committed as revision 15833 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/rdt.c | 12 +++++++----- libavformat/rdt.h | 4 +++- libavformat/rtsp.c | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/libavformat/rdt.c b/libavformat/rdt.c index 766158eabe..3553cd9987 100644 --- a/libavformat/rdt.c +++ b/libavformat/rdt.c @@ -173,7 +173,8 @@ rdt_load_mdpr (PayloadContext *rdt, AVStream *st, int rule_nr) int ff_rdt_parse_header(const uint8_t *buf, int len, - int *set_id, int *seq_no, int *stream_id, uint32_t *timestamp) + int *set_id, int *seq_no, int *stream_id, + int *is_keyframe, uint32_t *timestamp) { int consumed = 10; @@ -238,7 +239,8 @@ ff_rdt_parse_header(const uint8_t *buf, int len, if (set_id) *set_id = (buf[0]>>1) & 0x1f; if (seq_no) *seq_no = AV_RB16(buf+1); if (timestamp) *timestamp = AV_RB32(buf+4); - if (stream_id) *stream_id = buf[3] & 0x3f; + if (stream_id) *stream_id = (buf[3]>>1) & 0x1f; + if (is_keyframe) *is_keyframe = !(buf[3] & 0x1); return consumed; } @@ -287,7 +289,7 @@ int ff_rdt_parse_packet(RDTDemuxContext *s, AVPacket *pkt, const uint8_t *buf, int len) { - int seq_no, flags = 0, stream_id, set_id; + int seq_no, flags = 0, stream_id, set_id, is_keyframe; uint32_t timestamp; int rv= 0; @@ -304,10 +306,10 @@ ff_rdt_parse_packet(RDTDemuxContext *s, AVPacket *pkt, if (len < 12) return -1; - rv = ff_rdt_parse_header(buf, len, &set_id, &seq_no, &stream_id, ×tamp); + rv = ff_rdt_parse_header(buf, len, &set_id, &seq_no, &stream_id, &is_keyframe, ×tamp); if (rv < 0) return rv; - if (!(stream_id & 1) && (set_id != s->prev_set_id || timestamp != s->prev_timestamp)) { + if (is_keyframe && (set_id != s->prev_set_id || timestamp != s->prev_timestamp)) { flags |= PKT_FLAG_KEY; s->prev_set_id = set_id; s->prev_timestamp = timestamp; diff --git a/libavformat/rdt.h b/libavformat/rdt.h index 7e33b063be..12d53178c9 100644 --- a/libavformat/rdt.h +++ b/libavformat/rdt.h @@ -75,11 +75,13 @@ void ff_rdt_subscribe_rule2(RDTDemuxContext *s, char *cmd, int size, * @param set_id will be set to the set ID this packet belongs to * @param seq_no will be set to the sequence number this packet belongs to * @param stream_id will be set to the stream ID this packet belongs to + * @param is_keyframe will be whether this packet belongs to a keyframe * @param timestamp will be set to the timestamp of the packet * @return the amount of bytes consumed, or <0 on error */ int ff_rdt_parse_header(const uint8_t *buf, int len, - int *set_id, int *seq_no, int *stream_id, uint32_t *timestamp); + int *set_id, int *seq_no, int *stream_id, + int *is_keyframe, uint32_t *timestamp); /** * Parse RDT-style packet data (header + media data). diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 543032e35c..4db95ee8a0 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -1281,7 +1281,7 @@ static int tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, if (ret != len) return -1; if (rt->transport == RTSP_TRANSPORT_RDT && - ff_rdt_parse_header(buf, len, &id, NULL, NULL, NULL) < 0) + ff_rdt_parse_header(buf, len, &id, NULL, NULL, NULL, NULL) < 0) return -1; /* find the matching stream */