#include "network.h"
#include "rtpdec.h"
-#include "rtp_asf.h"
-#include "rtp_h264.h"
-#include "rtp_vorbis.h"
+#include "rtpdec_amr.h"
+#include "rtpdec_asf.h"
#include "rtpdec_h263.h"
+#include "rtpdec_h264.h"
+#include "rtpdec_xiph.h"
//#define DEBUG
/* statistics functions */
RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler= NULL;
-static RTPDynamicProtocolHandler mp4v_es_handler= {"MP4V-ES", CODEC_TYPE_VIDEO, CODEC_ID_MPEG4};
-static RTPDynamicProtocolHandler mpeg4_generic_handler= {"mpeg4-generic", CODEC_TYPE_AUDIO, CODEC_ID_AAC};
+static RTPDynamicProtocolHandler mp4v_es_handler= {"MP4V-ES", AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG4};
+static RTPDynamicProtocolHandler mpeg4_generic_handler= {"mpeg4-generic", AVMEDIA_TYPE_AUDIO, CODEC_ID_AAC};
void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler)
{
{
ff_register_dynamic_payload_handler(&mp4v_es_handler);
ff_register_dynamic_payload_handler(&mpeg4_generic_handler);
+ ff_register_dynamic_payload_handler(&ff_amr_nb_dynamic_handler);
+ ff_register_dynamic_payload_handler(&ff_amr_wb_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_h263_1998_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_h263_2000_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_h264_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler);
+ ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfv_handler);
ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler);
return 0;
}
+void rtp_send_punch_packets(URLContext* rtp_handle)
+{
+ ByteIOContext *pb;
+ uint8_t *buf;
+ int len;
+
+ /* Send a small RTP packet */
+ if (url_open_dyn_buf(&pb) < 0)
+ return;
+
+ put_byte(pb, (RTP_VERSION << 6));
+ put_byte(pb, 0); /* Payload type */
+ put_be16(pb, 0); /* Seq */
+ put_be32(pb, 0); /* Timestamp */
+ put_be32(pb, 0); /* SSRC */
+
+ put_flush_packet(pb);
+ len = url_close_dyn_buf(pb, &buf);
+ if ((len > 0) && buf)
+ url_write(rtp_handle, buf, len);
+ av_free(buf);
+
+ /* Send a minimal RTCP RR */
+ if (url_open_dyn_buf(&pb) < 0)
+ return;
+
+ put_byte(pb, (RTP_VERSION << 6));
+ put_byte(pb, 201); /* receiver report */
+ put_be16(pb, 1); /* length in words - 1 */
+ put_be32(pb, 0); /* our own SSRC */
+
+ put_flush_packet(pb);
+ len = url_close_dyn_buf(pb, &buf);
+ if ((len > 0) && buf)
+ url_write(rtp_handle, buf, len);
+ av_free(buf);
+}
+
+
/**
* 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
st->need_parsing = AVSTREAM_PARSE_FULL;
break;
default:
- if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
+ if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
av_set_pts_info(st, 32, 1, st->codec->sample_rate);
}
break;
return -1;
infos->nb_au_headers = au_headers_length / au_header_size;
- infos->au_headers = av_malloc(sizeof(struct AUHeaders) * infos->nb_au_headers);
+ if (!infos->au_headers || infos->au_headers_allocated < infos->nb_au_headers) {
+ av_free(infos->au_headers);
+ infos->au_headers = av_malloc(sizeof(struct AUHeaders) * infos->nb_au_headers);
+ infos->au_headers_allocated = infos->nb_au_headers;
+ }
/* XXX: We handle multiple AU Section as only one (need to fix this for interleaving)
In my test, the FAAD decoder does not behave correctly when sending each AU one by one
delta_timestamp = timestamp - s->last_rtcp_timestamp;
/* convert to the PTS timebase */
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->pts = s->range_start_offset + addend + delta_timestamp;
}
}
void rtp_parse_close(RTPDemuxContext *s)
{
// TODO: fold this into the protocol specific data fields.
+ av_free(s->rtp_payload_data->mode);
+ av_free(s->rtp_payload_data->au_headers);
if (!strcmp(ff_rtp_enc_name(s->payload_type), "MP2T")) {
ff_mpegts_parse_close(s->ts);
}