.codec_id = AV_CODEC_ID_OPUS,
};
+static RTPDynamicProtocolHandler t140_dynamic_handler = { /* RFC 4103 */
+ .enc_name = "t140",
+ .codec_type = AVMEDIA_TYPE_DATA,
+ .codec_id = AV_CODEC_ID_TEXT,
+};
+
static RTPDynamicProtocolHandler *rtp_first_dynamic_payload_handler = NULL;
void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler)
ff_register_dynamic_payload_handler(&ff_ac3_dynamic_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_dv_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_g726_16_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_g726_24_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_g726_32_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_mp4a_latm_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_mp4v_es_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_mpeg_audio_dynamic_handler);
+ ff_register_dynamic_payload_handler(&ff_mpeg_audio_robust_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_mpeg_video_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_mpeg4_generic_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_mpegts_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler);
ff_register_dynamic_payload_handler(&ff_vp8_dynamic_handler);
+ ff_register_dynamic_payload_handler(&ff_vp9_dynamic_handler);
ff_register_dynamic_payload_handler(&opus_dynamic_handler);
ff_register_dynamic_payload_handler(&realmedia_mp3_dynamic_handler);
ff_register_dynamic_payload_handler(&speex_dynamic_handler);
+ ff_register_dynamic_payload_handler(&t140_dynamic_handler);
}
RTPDynamicProtocolHandler *ff_rtp_handler_find_by_name(const char *name,
RTPDynamicProtocolHandler *handler;
for (handler = rtp_first_dynamic_payload_handler;
handler; handler = handler->next)
- if (!av_strcasecmp(name, handler->enc_name) &&
+ if (handler->enc_name &&
+ !av_strcasecmp(name, handler->enc_name) &&
codec_type == handler->codec_type)
return handler;
return NULL;
len = avio_close_dyn_buf(pb, &buf);
if ((len > 0) && buf) {
int av_unused result;
- av_dlog(s->ic, "sending %d bytes of RR\n", len);
+ av_log(s->ic, AV_LOG_TRACE, "sending %d bytes of RR\n", len);
result = ffurl_write(fd, buf, len);
- av_dlog(s->ic, "result from ffurl_write: %d\n", result);
+ av_log(s->ic, AV_LOG_TRACE, "result from ffurl_write: %d\n", result);
av_free(buf);
}
return 0;
s->ic = s1;
s->st = st;
s->queue_size = queue_size;
+
+ av_log(s->st ? s->st->codec : NULL, AV_LOG_VERBOSE,
+ "setting jitter buffer size to %d\n", s->queue_size);
+
rtp_init_statistics(&s->statistics, 0);
if (st) {
switch (st->codec->codec_id) {
s->prev_ret = 0;
}
-static void enqueue_packet(RTPDemuxContext *s, uint8_t *buf, int len)
+static int enqueue_packet(RTPDemuxContext *s, uint8_t *buf, int len)
{
uint16_t seq = AV_RB16(buf + 2);
RTPPacket **cur = &s->queue, *packet;
packet = av_mallocz(sizeof(*packet));
if (!packet)
- return;
+ return AVERROR(ENOMEM);
packet->recvtime = av_gettime_relative();
packet->seq = seq;
packet->len = len;
packet->next = *cur;
*cur = packet;
s->queue_len++;
+
+ return 0;
}
static int has_next_packet(RTPDemuxContext *s)
return rv;
} else {
/* Still missing some packet, enqueue this one. */
- enqueue_packet(s, buf, len);
+ rv = enqueue_packet(s, buf, len);
+ if (rv < 0)
+ return rv;
*bufptr = NULL;
/* Return the first enqueued packet if the queue is full,
* even if we're missing something */
- if (s->queue_len >= s->queue_size)
+ if (s->queue_len >= s->queue_size) {
+ av_log(s->st ? s->st->codec : NULL, AV_LOG_WARNING,
+ "jitter buffer full\n");
return rtp_parse_queued_packet(s, pkt);
+ }
return -1;
}
}
int (*parse_fmtp)(AVFormatContext *s,
AVStream *stream,
PayloadContext *data,
- char *attr, char *value))
+ const char *attr, const char *value))
{
char attr[256];
char *value;