[FFmpeg-cvslog] r25908 - in trunk/libavformat: rtpdec.c rtsp.c
mstorsjo
subversion
Tue Dec 7 14:29:44 CET 2010
Author: mstorsjo
Date: Tue Dec 7 14:29:44 2010
New Revision: 25908
Log:
rtsp/rtpdec: Set the AVStream time_base directly in rtsp when it is known
This fixes cases where the RTP time base and the sample rate of the stream
differ. Previously, the AVStream time_base was unconditionally set to
the sample rate (which initially was set to one value when parsing the
rtpmap field in the SDP, but later overridden by an a=SampleRate field).
Additionally, this makes the code actually use the stream time base set
in rtpmap for video codecs, instead of hardcoding it to always be 90 kHz.
Modified:
trunk/libavformat/rtpdec.c
trunk/libavformat/rtsp.c
Modified: trunk/libavformat/rtpdec.c
==============================================================================
--- trunk/libavformat/rtpdec.c Tue Dec 7 14:28:45 2010 (r25907)
+++ trunk/libavformat/rtpdec.c Tue Dec 7 14:29:44 2010 (r25908)
@@ -393,7 +393,6 @@ RTPDemuxContext *rtp_parse_open(AVFormat
return NULL;
}
} else {
- av_set_pts_info(st, 32, 1, 90000);
switch(st->codec->codec_id) {
case CODEC_ID_MPEG1VIDEO:
case CODEC_ID_MPEG2VIDEO:
@@ -405,16 +404,12 @@ RTPDemuxContext *rtp_parse_open(AVFormat
st->need_parsing = AVSTREAM_PARSE_FULL;
break;
case CODEC_ID_ADPCM_G722:
- av_set_pts_info(st, 32, 1, st->codec->sample_rate);
/* According to RFC 3551, the stream clock rate is 8000
* even if the sample rate is 16000. */
if (st->codec->sample_rate == 8000)
st->codec->sample_rate = 16000;
break;
default:
- if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
- av_set_pts_info(st, 32, 1, st->codec->sample_rate);
- }
break;
}
}
Modified: trunk/libavformat/rtsp.c
==============================================================================
--- trunk/libavformat/rtsp.c Tue Dec 7 14:28:45 2010 (r25907)
+++ trunk/libavformat/rtsp.c Tue Dec 7 14:29:44 2010 (r25908)
@@ -135,9 +135,10 @@ static void init_rtp_handler(RTPDynamicP
/* parse the rtpmap description: <codec_name>/<clock_rate>[/<other params>] */
static int sdp_parse_rtpmap(AVFormatContext *s,
- AVCodecContext *codec, RTSPStream *rtsp_st,
+ AVStream *st, RTSPStream *rtsp_st,
int payload_type, const char *p)
{
+ AVCodecContext *codec = st->codec;
char buf[256];
int i;
AVCodec *c;
@@ -181,6 +182,7 @@ static int sdp_parse_rtpmap(AVFormatCont
codec->channels = RTSP_DEFAULT_NB_AUDIO_CHANNELS;
if (i > 0) {
codec->sample_rate = i;
+ av_set_pts_info(st, 32, 1, codec->sample_rate);
get_word_sep(buf, sizeof(buf), "/", &p);
i = atoi(buf);
if (i > 0)
@@ -197,6 +199,8 @@ static int sdp_parse_rtpmap(AVFormatCont
break;
case AVMEDIA_TYPE_VIDEO:
av_log(s, AV_LOG_DEBUG, "video codec set to: %s\n", c_name);
+ if (i > 0)
+ av_set_pts_info(st, 32, 1, i);
break;
default:
break;
@@ -329,6 +333,8 @@ static void sdp_parse_line(AVFormatConte
RTPDynamicProtocolHandler *handler;
/* if standard payload type, we can find the codec right now */
ff_rtp_get_codec_info(st->codec, rtsp_st->sdp_payload_type);
+ if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
+ av_set_pts_info(st, 32, 1, st->codec->sample_rate);
/* Even static payload types may need a custom depacketizer */
handler = ff_rtp_handler_find_by_id(
rtsp_st->sdp_payload_type, st->codec->codec_type);
@@ -371,7 +377,7 @@ static void sdp_parse_line(AVFormatConte
payload_type = atoi(buf1);
st = s->streams[s->nb_streams - 1];
rtsp_st = st->priv_data;
- sdp_parse_rtpmap(s, st->codec, rtsp_st, payload_type, p);
+ sdp_parse_rtpmap(s, st, rtsp_st, payload_type, p);
} else if (av_strstart(p, "fmtp:", &p) ||
av_strstart(p, "framesize:", &p)) {
/* NOTE: fmtp is only supported AFTER the 'a=rtpmap:xxx' tag */
More information about the ffmpeg-cvslog
mailing list