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.