fix more dynamic protocol stuff, needed by the forthcoming h264
streaming patch. (Minor additions to give more information to the dynamic protocol handlers, and a slight rearrangement of code.) Patch by Ryan Martell %rdm4 A martellventures P com% Original thread: Date: Oct 29, 2006 2:30 AM Subject: Re: [Ffmpeg-devel] RTP patches & RFC Originally committed as revision 6831 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
3cedeeca02
commit
d0deedcb07
3 changed files with 82 additions and 31 deletions
|
@ -328,6 +328,7 @@ int rtp_check_and_send_back_rr(RTPDemuxContext *s, int count)
|
|||
* open a new RTP parse context for stream 'st'. 'st' can be NULL for
|
||||
* MPEG2TS streams to indicate that they should be demuxed inside the
|
||||
* rtp demux (otherwise CODEC_ID_MPEG2TS packets are returned)
|
||||
* TODO: change this to not take rtp_payload data, and use the new dynamic payload system.
|
||||
*/
|
||||
RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type, rtp_payload_data_t *rtp_payload_data)
|
||||
{
|
||||
|
@ -418,6 +419,39 @@ static int rtp_parse_mp4_au(RTPDemuxContext *s, const uint8_t *buf)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* This was the second switch in rtp_parse packet. Normalizes time, if required, sets stream_index, etc.
|
||||
*/
|
||||
static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
|
||||
{
|
||||
switch(s->st->codec->codec_id) {
|
||||
case CODEC_ID_MP2:
|
||||
case CODEC_ID_MPEG1VIDEO:
|
||||
if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) {
|
||||
int64_t addend;
|
||||
|
||||
int delta_timestamp;
|
||||
/* XXX: is it really necessary to unify the timestamp base ? */
|
||||
/* compute pts from timestamp with received ntp_time */
|
||||
delta_timestamp = timestamp - s->last_rtcp_timestamp;
|
||||
/* convert to 90 kHz without overflow */
|
||||
addend = (s->last_rtcp_ntp_time - s->first_rtcp_ntp_time) >> 14;
|
||||
addend = (addend * 5625) >> 14;
|
||||
pkt->pts = addend + delta_timestamp;
|
||||
}
|
||||
break;
|
||||
case CODEC_ID_MPEG4AAC:
|
||||
case CODEC_ID_H264:
|
||||
case CODEC_ID_MPEG4:
|
||||
pkt->pts = timestamp;
|
||||
break;
|
||||
default:
|
||||
/* no timestamp info yet */
|
||||
break;
|
||||
}
|
||||
pkt->stream_index = s->st->index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse an RTP or RTCP packet directly sent as a buffer.
|
||||
* @param s RTP parse context.
|
||||
|
@ -431,15 +465,20 @@ int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
|
|||
const uint8_t *buf, int len)
|
||||
{
|
||||
unsigned int ssrc, h;
|
||||
int payload_type, seq, delta_timestamp, ret;
|
||||
int payload_type, seq, ret;
|
||||
AVStream *st;
|
||||
uint32_t timestamp;
|
||||
int rv= 0;
|
||||
|
||||
if (!buf) {
|
||||
/* return the next packets, if any */
|
||||
if(s->st && s->parse_packet) {
|
||||
return s->parse_packet(s, pkt, 0, NULL, 0);
|
||||
timestamp= 0; ///< Should not be used if buf is NULL, but should be set to the timestamp of the packet returned....
|
||||
rv= s->parse_packet(s, pkt, ×tamp, NULL, 0);
|
||||
finalize_packet(s, pkt, timestamp);
|
||||
return rv;
|
||||
} else {
|
||||
// TODO: Move to a dynamic packet handler (like above)
|
||||
if (s->read_buf_index >= s->read_buf_size)
|
||||
return -1;
|
||||
ret = mpegts_parse_packet(s->ts, pkt, s->buf + s->read_buf_index,
|
||||
|
@ -548,12 +587,11 @@ int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
|
|||
}
|
||||
s->read_buf_size = len;
|
||||
s->buf_ptr = buf;
|
||||
pkt->stream_index = s->st->index;
|
||||
return 0; ///< Temporary return.
|
||||
rv= 0;
|
||||
break;
|
||||
default:
|
||||
if(s->parse_packet) {
|
||||
return s->parse_packet(s, pkt, timestamp, buf, len);
|
||||
rv= s->parse_packet(s, pkt, ×tamp, buf, len);
|
||||
} else {
|
||||
av_new_packet(pkt, len);
|
||||
memcpy(pkt->data, buf, len);
|
||||
|
@ -561,32 +599,10 @@ int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
|
|||
break;
|
||||
}
|
||||
|
||||
switch(st->codec->codec_id) {
|
||||
case CODEC_ID_MP2:
|
||||
case CODEC_ID_MPEG1VIDEO:
|
||||
if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) {
|
||||
int64_t addend;
|
||||
/* XXX: is it really necessary to unify the timestamp base ? */
|
||||
/* compute pts from timestamp with received ntp_time */
|
||||
delta_timestamp = timestamp - s->last_rtcp_timestamp;
|
||||
/* convert to 90 kHz without overflow */
|
||||
addend = (s->last_rtcp_ntp_time - s->first_rtcp_ntp_time) >> 14;
|
||||
addend = (addend * 5625) >> 14;
|
||||
pkt->pts = addend + delta_timestamp;
|
||||
}
|
||||
break;
|
||||
case CODEC_ID_MPEG4AAC:
|
||||
case CODEC_ID_H264:
|
||||
case CODEC_ID_MPEG4:
|
||||
pkt->pts = timestamp;
|
||||
break;
|
||||
default:
|
||||
/* no timestamp info yet */
|
||||
break;
|
||||
}
|
||||
pkt->stream_index = s->st->index;
|
||||
// now perform timestamp things....
|
||||
finalize_packet(s, pkt, timestamp);
|
||||
}
|
||||
return 0;
|
||||
return rv;
|
||||
}
|
||||
|
||||
void rtp_parse_close(RTPDemuxContext *s)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue