Go to the documentation of this file.
38 #define MIN_FEEDBACK_INTERVAL 200000
151 uintptr_t
i = (uintptr_t)*opaque;
155 *opaque = (
void*)(
i + 1);
180 if (
handler->static_payload_id &&
handler->static_payload_id ==
id &&
196 if (payload_len < 20) {
202 s->last_rtcp_ntp_time =
AV_RB64(buf + 8);
203 s->last_rtcp_timestamp =
AV_RB32(buf + 16);
205 s->first_rtcp_ntp_time =
s->last_rtcp_ntp_time;
206 if (!
s->base_timestamp)
207 s->base_timestamp =
s->last_rtcp_timestamp;
208 s->rtcp_ts_offset = (
int32_t)(
s->last_rtcp_timestamp -
s->base_timestamp);
222 #define RTP_SEQ_MOD (1 << 16)
227 s->max_seq = base_sequence;
239 s->base_seq = seq - 1;
242 s->expected_prior = 0;
243 s->received_prior = 0;
251 uint16_t udelta = seq -
s->max_seq;
252 const int MAX_DROPOUT = 3000;
253 const int MAX_MISORDER = 100;
254 const int MIN_SEQUENTIAL = 2;
259 if (seq ==
s->max_seq + 1) {
262 if (
s->probation == 0) {
268 s->probation = MIN_SEQUENTIAL - 1;
271 }
else if (udelta < MAX_DROPOUT) {
273 if (seq < s->max_seq) {
280 if (seq ==
s->bad_seq) {
296 uint32_t arrival_timestamp)
299 uint32_t transit = arrival_timestamp - sent_timestamp;
300 uint32_t prev_transit =
s->transit;
301 int32_t d = transit - prev_transit;
307 s->transit = transit;
310 s->jitter += d - (
int32_t) ((
s->jitter + 8) >> 4);
322 uint32_t extended_max;
323 uint32_t expected_interval;
324 uint32_t received_interval;
329 if ((!fd && !avio) || (count < 1))
334 s->octet_count += count;
340 s->last_octet_count =
s->octet_count;
356 extended_max =
stats->cycles +
stats->max_seq;
357 expected = extended_max -
stats->base_seq;
358 lost = expected -
stats->received;
359 lost =
FFMIN(lost, 0xffffff);
360 expected_interval = expected -
stats->expected_prior;
361 stats->expected_prior = expected;
362 received_interval =
stats->received -
stats->received_prior;
364 lost_interval = expected_interval - received_interval;
365 if (expected_interval == 0 || lost_interval <= 0)
368 fraction = (lost_interval << 8) / expected_interval;
370 fraction = (fraction << 24) | lost;
380 uint32_t middle_32_bits =
s->last_rtcp_ntp_time >> 16;
391 len = strlen(
s->hostname);
406 if ((
len > 0) && buf) {
423 bytestream_put_byte(&ptr, 0);
424 bytestream_put_be16(&ptr, 0);
425 bytestream_put_be32(&ptr, 0);
426 bytestream_put_be32(&ptr, 0);
433 bytestream_put_byte(&ptr,
RTCP_RR);
434 bytestream_put_be16(&ptr, 1);
435 bytestream_put_be32(&ptr, 0);
441 uint16_t *missing_mask)
444 uint16_t next_seq =
s->seq + 1;
447 if (!
pkt ||
pkt->seq == next_seq)
451 for (
i = 1;
i <= 16;
i++) {
452 uint16_t missing_seq = next_seq +
i;
454 int16_t
diff =
pkt->seq - missing_seq;
461 if (
pkt->seq == missing_seq)
463 *missing_mask |= 1 << (
i - 1);
466 *first_missing = next_seq;
473 int len, need_keyframe, missing_packets;
477 uint16_t first_missing = 0, missing_mask = 0;
482 need_keyframe =
s->handler &&
s->handler->need_keyframe &&
483 s->handler->need_keyframe(
s->dynamic_protocol_context);
486 if (!need_keyframe && !missing_packets)
493 if (
s->last_feedback_time &&
496 s->last_feedback_time = now;
512 if (missing_packets) {
527 if (
len > 0 && buf) {
556 bytestream_put_byte (&bs, 0x1);
560 bytestream_put_le16 (&bs, 0);
562 bytestream_put_le32 (&bs, 48000);
564 bytestream_put_le16 (&bs, 0x0);
566 bytestream_put_byte (&bs, 0x0);
576 int payload_type,
int queue_size)
584 s->payload_type = payload_type;
589 s->queue_size = queue_size;
607 "Error creating opus extradata: %s\n",
618 gethostname(
s->hostname,
sizeof(
s->hostname));
625 s->dynamic_protocol_context =
ctx;
637 int64_t rtcp_time, delta_timestamp, delta_time;
646 delta_timestamp = (
int64_t)timestamp - (
int64_t)
s->last_rtcp_timestamp;
649 prft->
wallclock = rtcp_time + delta_time;
676 delta_timestamp = timestamp -
s->last_rtcp_timestamp;
678 addend =
av_rescale(
s->last_rtcp_ntp_time -
s->first_rtcp_ntp_time,
679 s->st->time_base.den,
680 (uint64_t)
s->st->time_base.num << 32);
681 pkt->
pts =
s->range_start_offset +
s->rtcp_ts_offset + addend +
686 if (!
s->base_timestamp)
687 s->base_timestamp = timestamp;
691 s->unwrapped_timestamp += timestamp;
693 s->unwrapped_timestamp += (
int32_t)(timestamp -
s->timestamp);
694 s->timestamp = timestamp;
695 pkt->
pts =
s->unwrapped_timestamp +
s->range_start_offset -
700 const uint8_t *buf,
int len)
703 int payload_type, seq,
flags = 0;
709 csrc = buf[0] & 0x0f;
711 payload_type = buf[1] & 0x7f;
721 if (
s->payload_type != payload_type)
728 "RTP: PT=%02x: bad cseq %04x expected=%04x\n",
729 payload_type, seq, ((
s->seq + 1) & 0xffff));
734 int padding = buf[
len - 1];
735 if (
len >= 12 + padding)
754 ext = (
AV_RB16(buf + 2) + 1) << 2;
763 if (
s->handler &&
s->handler->parse_packet) {
764 rv =
s->handler->parse_packet(
s->ic,
s->dynamic_protocol_context,
765 s->st,
pkt, ×tamp, buf,
len, seq,
797 uint16_t seq =
AV_RB16(buf + 2);
802 int16_t
diff = seq - (*cur)->seq;
824 return s->queue &&
s->queue->seq == (uint16_t) (
s->seq + 1);
829 return s->queue ?
s->queue->recvtime : 0;
837 if (
s->queue_len <= 0)
841 int pkt_missed =
s->queue->seq -
s->seq - 1;
844 pkt_missed += UINT16_MAX;
846 "RTP: missed %d packets\n", pkt_missed);
851 next =
s->queue->next;
860 uint8_t **bufptr,
int len)
862 uint8_t *buf = bufptr ? *bufptr :
NULL;
871 if (
s->prev_ret <= 0)
874 if (
s->handler &&
s->handler->parse_packet) {
878 rv =
s->handler->parse_packet(
s->ic,
s->dynamic_protocol_context,
905 if ((
s->seq == 0 && !
s->queue) ||
s->queue_size <= 1) {
909 uint16_t seq =
AV_RB16(buf + 2);
910 int16_t
diff = seq -
s->seq;
914 "RTP: dropping old packet received too late\n");
916 }
else if (
diff <= 1) {
928 if (
s->queue_len >=
s->queue_size) {
947 uint8_t **bufptr,
int len)
971 const char *attr,
const char *
value))
976 int value_size = strlen(p) + 1;
984 while (*p && *p ==
' ')
986 while (*p && *p !=
' ')
988 while (*p && *p ==
' ')
993 value, value_size)) {
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
#define AV_LOG_WARNING
Something somehow does not look correct.
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
static const RTPDynamicProtocolHandler *const rtp_dynamic_protocol_handler_list[]
const RTPDynamicProtocolHandler ff_amr_nb_dynamic_handler
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
int ff_rtp_send_rtcp_feedback(RTPDemuxContext *s, URLContext *fd, AVIOContext *avio)
This struct describes the properties of an encoded stream.
static int parse_fmtp(AVFormatContext *s, AVStream *stream, PayloadContext *data, const char *attr, const char *value)
int ff_parse_fmtp(AVFormatContext *s, AVStream *stream, PayloadContext *data, const char *p, int(*parse_fmtp)(AVFormatContext *s, AVStream *stream, PayloadContext *data, const char *attr, const char *value))
static int enqueue_packet(RTPDemuxContext *s, uint8_t *buf, int len)
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
static int ffurl_write(URLContext *h, const uint8_t *buf, int size)
Write size bytes from buf to the resource accessed by h.
static const RTPDynamicProtocolHandler l24_dynamic_handler
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
int64_t wallclock
A UTC timestamp, in microseconds, since Unix epoch (e.g, av_gettime()).
#define RTP_FLAG_MARKER
RTP marker bit was set for this packet.
#define AV_LOG_VERBOSE
Detailed information.
const RTPDynamicProtocolHandler ff_av1_dynamic_handler
int nb_channels
Number of channels in this layout.
int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, URLContext *fd, AVIOContext *avio, int count)
some rtp servers assume client is dead if they don't hear from them...
enum AVMediaType codec_type
int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx)
Close the dynamic buffer and make a packet from it.
void ff_rtp_send_punch_packets(URLContext *rtp_handle)
Send a dummy packet on both port pairs to set up the connection state in potential NAT routers,...
int ff_srtp_decrypt(struct SRTPContext *s, uint8_t *buf, int *lenptr)
void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite, const char *params)
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static const RTPDynamicProtocolHandler gsm_dynamic_handler
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
static const RTPDynamicProtocolHandler t140_dynamic_handler
#define RTCP_TX_RATIO_NUM
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
const RTPDynamicProtocolHandler ff_rdt_live_video_handler
static int opus_write_extradata(AVCodecParameters *codecpar)
#define RTCP_TX_RATIO_DEN
static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
This was the second switch in rtp_parse packet.
const RTPDynamicProtocolHandler ff_dv_dynamic_handler
static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence)
static int has_next_packet(RTPDemuxContext *s)
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
const RTPDynamicProtocolHandler * ff_rtp_handler_find_by_id(int id, enum AVMediaType codec_type)
Find a registered rtp dynamic protocol handler with a matching codec ID.
static void handler(vbi_event *ev, void *user_data)
static int rtp_set_prft(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
void avio_flush(AVIOContext *s)
Force flushing of buffered data.
static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq)
AVCodecParameters * codecpar
Codec parameters associated with this stream.
#define MIN_FEEDBACK_INTERVAL
and forward the result(frame or status change) to the corresponding input. If nothing is possible
static int find_missing_packets(RTPDemuxContext *s, uint16_t *first_missing, uint16_t *missing_mask)
int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s)
void avio_w8(AVIOContext *s, int b)
This structure supplies correlation between a packet timestamp and a wall clock production time.
AVChannelLayout ch_layout
Audio only.
const RTPDynamicProtocolHandler ff_rdt_audio_handler
static void stats(AVPacket *const *in, int n_in, unsigned *_max, unsigned *_sum)
#define RTP_MIN_PACKET_LENGTH
int sample_rate
Audio only.
@ AV_CODEC_ID_GSM
as in Berlin toast format
const RTPDynamicProtocolHandler ff_rdt_video_handler
FFmpeg currently uses a custom build this text attempts to document some of its obscure features and options Makefile the full command issued by make and its output will be shown on the screen DBG Preprocess x86 external assembler files to a dbg asm file in the object which then gets compiled Helps in developing those assembler files DESTDIR Destination directory for the install useful to prepare packages or install FFmpeg in cross environments GEN Set to ‘1’ to generate the missing or mismatched references Makefile builds all the libraries and the executables fate Run the fate test suite
void ff_rtp_parse_close(RTPDemuxContext *s)
#define RTP_PT_IS_RTCP(x)
static const RTPDynamicProtocolHandler realmedia_mp3_dynamic_handler
RTPDemuxContext * ff_rtp_parse_open(AVFormatContext *s1, AVStream *st, int payload_type, int queue_size)
open a new RTP parse context for stream 'st'.
int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size)
Initialize a reference-counted packet from av_malloc()ed data.
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
#define AV_NOPTS_VALUE
Undefined timestamp value.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
const RTPDynamicProtocolHandler ff_ac3_dynamic_handler
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
void avio_wb32(AVIOContext *s, unsigned int val)
void ff_srtp_free(struct SRTPContext *s)
const RTPDynamicProtocolHandler * ff_rtp_handler_find_by_name(const char *name, enum AVMediaType codec_type)
Find a registered rtp dynamic protocol handler with the specified name.
@ AV_PKT_DATA_PRFT
Producer Reference Time data corresponding to the AVProducerReferenceTime struct, usually exported by...
static const RTPDynamicProtocolHandler speex_dynamic_handler
static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, const uint8_t *buf, int len)
static const RTPDynamicProtocolHandler * rtp_handler_iterate(void **opaque)
Iterate over all registered rtp dynamic protocol handlers.
static av_always_inline void bytestream_put_buffer(uint8_t **b, const uint8_t *src, unsigned int size)
static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len)
#define i(width, name, range_min, range_max)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
#define AV_TIME_BASE
Internal time base represented as integer.
int ff_rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt, uint8_t **bufptr, int len)
Parse an RTP or RTCP packet directly sent as a buffer.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
int ff_srtp_set_crypto(struct SRTPContext *s, const char *suite, const char *params)
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
static const RTPDynamicProtocolHandler opus_dynamic_handler
const RTPDynamicProtocolHandler ff_amr_wb_dynamic_handler
@ AV_CODEC_ID_TEXT
raw UTF-8 text
int index
stream index in AVFormatContext
static int rtp_parse_one_packet(RTPDemuxContext *s, AVPacket *pkt, uint8_t **bufptr, int len)
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp, uint32_t arrival_timestamp)
const RTPDynamicProtocolHandler ff_rdt_live_audio_handler
static void rtp_init_sequence(RTPStatistics *s, uint16_t seq)
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx, const RTPDynamicProtocolHandler *handler)
This structure stores compressed data.
void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
void avio_wb16(AVIOContext *s, unsigned int val)
#define flags(name, subs,...)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
RTP/AV1 specific private data.
static int rtp_parse_queued_packet(RTPDemuxContext *s, AVPacket *pkt)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_RB64
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16