[FFmpeg-cvslog] r17767 - in trunk/libavformat: rtp_h264.c rtpdec.c
rbultje
subversion
Tue Mar 3 14:51:34 CET 2009
Author: rbultje
Date: Tue Mar 3 14:51:34 2009
New Revision: 17767
Log:
Don't let finalize_packet() touch pkt->stream_index. Instead, let individual
payload handlers take care of that themselves at their own option. What this
patch really does is "fix" a bug in MS-RTSP protocol where incoming packets
are always coming in over the connection (UDP) or interleave-id (TCP) of
the stream-id of the first ASF packet in the RTP packet. However, RTP packets
may contain multiple ASF packets (and usually do, from what I can see), and
therefore this leads to playback bugs. The intended stream-id per ASF packet
is given in the respective ASF packet header. The ASF demuxer will correctly
read this and set pkt->stream_index, but since the "stream" parameter can
not be known to rtpdec.c or any of the RTP/RTSP code, the "st" parameter
in all these functions is basically invalid. Therefore, using st->id as
pkt->stream_index leads to various playback bugs. The result of this patch
is that pkt->stream_index is left untouched for RTP/ASF (and possibly for
other payloads that have similar behaviour).
The patch was discussed in the "[PATCH] rtpdec.c: don't overwrite
pkt->stream_index in finalize_packet()" thread on the mailinglist.
Modified:
trunk/libavformat/rtp_h264.c
trunk/libavformat/rtpdec.c
Modified: trunk/libavformat/rtp_h264.c
==============================================================================
--- trunk/libavformat/rtp_h264.c Tue Mar 3 14:43:24 2009 (r17766)
+++ trunk/libavformat/rtp_h264.c Tue Mar 3 14:51:34 2009 (r17767)
@@ -310,6 +310,8 @@ static int h264_handle_packet(AVFormatCo
break;
}
+ pkt->stream_index = st->index;
+
return result;
}
Modified: trunk/libavformat/rtpdec.c
==============================================================================
--- trunk/libavformat/rtpdec.c Tue Mar 3 14:43:24 2009 (r17766)
+++ trunk/libavformat/rtpdec.c Tue Mar 3 14:51:34 2009 (r17767)
@@ -382,7 +382,6 @@ static void finalize_packet(RTPDemuxCont
addend = av_rescale(s->last_rtcp_ntp_time - s->first_rtcp_ntp_time, s->st->time_base.den, (uint64_t)s->st->time_base.num << 32);
pkt->pts = addend + delta_timestamp;
}
- pkt->stream_index = s->st->index;
}
/**
@@ -536,6 +535,8 @@ int rtp_parse_packet(RTPDemuxContext *s,
memcpy(pkt->data, buf, len);
break;
}
+
+ pkt->stream_index = st->index;
}
// now perform timestamp things....
More information about the ffmpeg-cvslog
mailing list