Mercurial > libavformat.hg
comparison rtpdec.c @ 3534:e04ae2357e66 libavformat
Fix A/V synch for RTP streams that do not contain MPEG1 or 2
(correctly compute the presentation times based on the RTP timestamps
and the RTCP SR packets)
author | lucabe |
---|---|
date | Wed, 02 Jul 2008 10:23:27 +0000 |
parents | 6f61c3b36632 |
children | 5e0191d9e713 |
comparison
equal
deleted
inserted
replaced
3533:e2cd40f4851b | 3534:e04ae2357e66 |
---|---|
280 s->first_rtcp_ntp_time = AV_NOPTS_VALUE; | 280 s->first_rtcp_ntp_time = AV_NOPTS_VALUE; |
281 s->ic = s1; | 281 s->ic = s1; |
282 s->st = st; | 282 s->st = st; |
283 s->rtp_payload_data = rtp_payload_data; | 283 s->rtp_payload_data = rtp_payload_data; |
284 rtp_init_statistics(&s->statistics, 0); // do we know the initial sequence from sdp? | 284 rtp_init_statistics(&s->statistics, 0); // do we know the initial sequence from sdp? |
285 av_set_pts_info(s->st, 32, 1, 90000); | |
285 if (!strcmp(ff_rtp_enc_name(payload_type), "MP2T")) { | 286 if (!strcmp(ff_rtp_enc_name(payload_type), "MP2T")) { |
286 s->ts = mpegts_parse_open(s->ic); | 287 s->ts = mpegts_parse_open(s->ic); |
287 if (s->ts == NULL) { | 288 if (s->ts == NULL) { |
288 av_free(s); | 289 av_free(s); |
289 return NULL; | 290 return NULL; |
297 case CODEC_ID_MPEG4: | 298 case CODEC_ID_MPEG4: |
298 case CODEC_ID_H264: | 299 case CODEC_ID_H264: |
299 st->need_parsing = AVSTREAM_PARSE_FULL; | 300 st->need_parsing = AVSTREAM_PARSE_FULL; |
300 break; | 301 break; |
301 default: | 302 default: |
303 if (st->codec->codec_type == CODEC_TYPE_AUDIO) { | |
304 av_set_pts_info(st, 32, 1, st->codec->sample_rate); | |
305 } | |
302 break; | 306 break; |
303 } | 307 } |
304 } | 308 } |
305 // needed to send back RTCP RR in RTSP sessions | 309 // needed to send back RTCP RR in RTSP sessions |
306 s->rtp_ctx = rtpc; | 310 s->rtp_ctx = rtpc; |
359 /** | 363 /** |
360 * This was the second switch in rtp_parse packet. Normalizes time, if required, sets stream_index, etc. | 364 * This was the second switch in rtp_parse packet. Normalizes time, if required, sets stream_index, etc. |
361 */ | 365 */ |
362 static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp) | 366 static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp) |
363 { | 367 { |
364 switch(s->st->codec->codec_id) { | |
365 case CODEC_ID_MP2: | |
366 case CODEC_ID_MPEG1VIDEO: | |
367 case CODEC_ID_MPEG2VIDEO: | |
368 if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) { | 368 if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) { |
369 int64_t addend; | 369 int64_t addend; |
370 | 370 |
371 int delta_timestamp; | 371 int delta_timestamp; |
372 /* XXX: is it really necessary to unify the timestamp base ? */ | |
373 /* compute pts from timestamp with received ntp_time */ | 372 /* compute pts from timestamp with received ntp_time */ |
374 delta_timestamp = timestamp - s->last_rtcp_timestamp; | 373 delta_timestamp = timestamp - s->last_rtcp_timestamp; |
375 /* convert to 90 kHz without overflow */ | 374 /* convert to the PTS timebase */ |
376 addend = (s->last_rtcp_ntp_time - s->first_rtcp_ntp_time) >> 14; | 375 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); |
377 addend = (addend * 5625) >> 14; | |
378 pkt->pts = addend + delta_timestamp; | 376 pkt->pts = addend + delta_timestamp; |
379 } | 377 } |
380 break; | |
381 case CODEC_ID_AAC: | |
382 case CODEC_ID_H264: | |
383 case CODEC_ID_MPEG4: | |
384 pkt->pts = timestamp; | |
385 break; | |
386 default: | |
387 /* no timestamp info yet */ | |
388 break; | |
389 } | |
390 pkt->stream_index = s->st->index; | 378 pkt->stream_index = s->st->index; |
391 } | 379 } |
392 | 380 |
393 /** | 381 /** |
394 * Parse an RTP or RTCP packet directly sent as a buffer. | 382 * Parse an RTP or RTCP packet directly sent as a buffer. |