37 #define MIN_FEEDBACK_INTERVAL 200000 140 uintptr_t
i = (uintptr_t)*opaque;
144 *opaque = (
void*)(i + 1);
185 if (payload_len < 20) {
211 #define RTP_SEQ_MOD (1 << 16) 240 uint16_t udelta = seq - s->
max_seq;
241 const int MAX_DROPOUT = 3000;
242 const int MAX_MISORDER = 100;
243 const int MIN_SEQUENTIAL = 2;
260 }
else if (udelta < MAX_DROPOUT) {
262 if (seq < s->max_seq) {
285 uint32_t arrival_timestamp)
288 uint32_t transit = arrival_timestamp - sent_timestamp;
289 uint32_t prev_transit = s->
transit;
290 int32_t d = transit - prev_transit;
311 uint32_t extended_max;
312 uint32_t expected_interval;
313 uint32_t received_interval;
318 if ((!fd && !avio) || (count < 1))
346 expected = extended_max - stats->
base_seq;
348 lost =
FFMIN(lost, 0xffffff);
353 lost_interval = expected_interval - received_interval;
354 if (expected_interval == 0 || lost_interval <= 0)
357 fraction = (lost_interval << 8) / expected_interval;
359 fraction = (fraction << 24) | lost;
388 for (len = (7 + len) % 4; len % 4; len++)
395 if ((len > 0) && buf) {
412 bytestream_put_byte(&ptr, 0);
413 bytestream_put_be16(&ptr, 0);
414 bytestream_put_be32(&ptr, 0);
415 bytestream_put_be32(&ptr, 0);
422 bytestream_put_byte(&ptr,
RTCP_RR);
423 bytestream_put_be16(&ptr, 1);
424 bytestream_put_be32(&ptr, 0);
430 uint16_t *missing_mask)
433 uint16_t next_seq = s->
seq + 1;
436 if (!pkt || pkt->
seq == next_seq)
440 for (i = 1; i <= 16; i++) {
441 uint16_t missing_seq = next_seq +
i;
443 int16_t
diff = pkt->
seq - missing_seq;
450 if (pkt->
seq == missing_seq)
452 *missing_mask |= 1 << (i - 1);
455 *first_missing = next_seq;
462 int len, need_keyframe, missing_packets;
466 uint16_t first_missing = 0, missing_mask = 0;
475 if (!need_keyframe && !missing_packets)
501 if (missing_packets) {
516 if (len > 0 && buf) {
545 bytestream_put_byte (&bs, 0x1);
547 bytestream_put_byte (&bs, codecpar->
channels);
549 bytestream_put_le16 (&bs, 0);
551 bytestream_put_le32 (&bs, 48000);
553 bytestream_put_le16 (&bs, 0x0);
555 bytestream_put_byte (&bs, 0x0);
565 int payload_type,
int queue_size)
596 "Error creating opus extradata: %s\n",
668 int payload_type, seq,
flags = 0;
674 csrc = buf[0] & 0x0f;
676 payload_type = buf[1] & 0x7f;
693 "RTP: PT=%02x: bad cseq %04x expected=%04x\n",
694 payload_type, seq, ((s->
seq + 1) & 0xffff));
699 int padding = buf[len - 1];
700 if (len >= 12 + padding)
719 ext = (
AV_RB16(buf + 2) + 1) << 2;
730 s->
st, pkt, ×tamp, buf, len, seq,
735 memcpy(pkt->
data, buf, len);
762 uint16_t seq =
AV_RB16(buf + 2);
767 int16_t
diff = seq - (*cur)->seq;
807 "RTP: missed %d packets\n", s->
queue->
seq - s->
seq - 1);
839 s->
st, pkt, ×tamp,
NULL, 0, 0,
869 uint16_t seq =
AV_RB16(buf + 2);
874 "RTP: dropping old packet received too late\n");
876 }
else if (diff <= 1) {
931 const char *attr,
const char *
value))
936 int value_size = strlen(p) + 1;
944 while (*p && *p ==
' ')
946 while (*p && *p !=
' ')
948 while (*p && *p ==
' ')
953 value, value_size)) {
954 res =
parse_fmtp(s, stream, data, attr, value);
int queue_size
The size of queue, or 0 if reordering is disabled.
const RTPDynamicProtocolHandler ff_rdt_live_audio_handler
void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite, const char *params)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
const RTPDynamicProtocolHandler ff_amr_nb_dynamic_handler
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 avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
ptrdiff_t const GLvoid * data
#define AV_LOG_WARNING
Something somehow does not look correct.
static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp, uint32_t arrival_timestamp)
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
Write size bytes from buf to the resource accessed by h.
int64_t range_start_offset
int prev_ret
Fields for packet reordering.
RTP/JPEG specific private data.
int64_t last_feedback_time
unsigned int last_octet_count
static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, const uint8_t *buf, int len)
RTPPacket * queue
A sorted queue of buffered packets not yet returned.
static int parse_fmtp(AVFormatContext *s, AVStream *stream, PayloadContext *data, const char *attr, const char *value)
static int opus_write_extradata(AVCodecParameters *codecpar)
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
int index
stream index in AVFormatContext
#define RTCP_TX_RATIO_NUM
const RTPDynamicProtocolHandler * handler
enum AVMediaType codec_type
static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
uint64_t last_rtcp_ntp_time
uint32_t cycles
shifted count of sequence number cycles
#define RTCP_TX_RATIO_DEN
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
const RTPDynamicProtocolHandler ff_rdt_video_handler
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
static int find_missing_packets(RTPDemuxContext *s, uint16_t *first_missing, uint16_t *missing_mask)
This struct describes the properties of an encoded stream.
enum AVMediaType codec_type
RTPDemuxContext * ff_rtp_parse_open(AVFormatContext *s1, AVStream *st, int payload_type, int queue_size)
open a new RTP parse context for stream 'st'.
static const RTPDynamicProtocolHandler *const rtp_dynamic_protocol_handler_list[]
PayloadContext * dynamic_protocol_context
uint64_t first_rtcp_ntp_time
uint32_t base_seq
base sequence number
void ff_srtp_free(struct SRTPContext *s)
int(* need_keyframe)(PayloadContext *context)
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
#define RTP_MIN_PACKET_LENGTH
void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
GLsizei GLboolean const GLfloat * value
int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size)
Initialize a reference-counted packet from av_malloc()ed data.
static void handler(vbi_event *ev, void *user_data)
int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size)
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
static int rtp_parse_queued_packet(RTPDemuxContext *s, AVPacket *pkt)
#define AV_LOG_VERBOSE
Detailed information.
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
uint32_t expected_prior
packets expected in last interval
const RTPDynamicProtocolHandler ff_rdt_audio_handler
const RTPDynamicProtocolHandler * ff_rtp_handler_iterate(void **opaque)
Iterate over all registered rtp dynamic protocol handlers.
static const RTPDynamicProtocolHandler l24_dynamic_handler
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define RTP_FLAG_MARKER
RTP marker bit was set for this packet.
const RTPDynamicProtocolHandler ff_amr_wb_dynamic_handler
int probation
sequence packets till source is valid
static void rtp_init_sequence(RTPStatistics *s, uint16_t seq)
static const RTPDynamicProtocolHandler opus_dynamic_handler
void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx, const RTPDynamicProtocolHandler *handler)
DynamicPayloadPacketHandlerProc parse_packet
Parse handler for this dynamic packet.
uint32_t transit
relative transit time for previous packet
uint32_t jitter
estimated jitter.
int queue_len
The number of packets in queue.
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
int ff_srtp_decrypt(struct SRTPContext *s, uint8_t *buf, int *lenptr)
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
#define AV_TIME_BASE
Internal time base represented as integer.
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
static void stats(AVPacket *const *in, int n_in, unsigned *_max, unsigned *_sum)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
int ff_rtp_send_rtcp_feedback(RTPDemuxContext *s, URLContext *fd, AVIOContext *avio)
uint32_t received
packets received
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
const RTPDynamicProtocolHandler ff_rdt_live_video_handler
int64_t last_rtcp_reception_time
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
static int rtp_parse_one_packet(RTPDemuxContext *s, AVPacket *pkt, uint8_t **bufptr, int len)
int64_t unwrapped_timestamp
uint32_t last_rtcp_timestamp
static int has_next_packet(RTPDemuxContext *s)
void avio_w8(AVIOContext *s, int b)
RTPStatistics statistics
Statistics for this stream (used by RTCP receiver reports)
uint32_t received_prior
packets received in last interval
uint32_t bad_seq
last bad sequence number + 1
void avio_flush(AVIOContext *s)
Force flushing of buffered data.
int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s)
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...
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 void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
This was the second switch in rtp_parse packet.
uint16_t max_seq
highest sequence number seen
#define RTP_PT_IS_RTCP(x)
void avio_wb16(AVIOContext *s, unsigned int val)
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
#define flags(name, subs,...)
static const RTPDynamicProtocolHandler gsm_dynamic_handler
int sample_rate
Audio only.
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
static const RTPDynamicProtocolHandler realmedia_mp3_dynamic_handler
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx)
Close the dynamic buffer and make a packet from it.
static av_always_inline void bytestream_put_buffer(uint8_t **b, const uint8_t *src, unsigned int size)
static av_always_inline int diff(const uint32_t a, const uint32_t b)
as in Berlin toast format
static const RTPDynamicProtocolHandler t140_dynamic_handler
int ff_srtp_set_crypto(struct SRTPContext *s, const char *suite, const char *params)
const RTPDynamicProtocolHandler ff_dv_dynamic_handler
void ff_rtp_parse_close(RTPDemuxContext *s)
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
and forward the result(frame or status change) to the corresponding input.If nothing is possible
void avio_wb32(AVIOContext *s, unsigned int val)
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
static int enqueue_packet(RTPDemuxContext *s, uint8_t *buf, int len)
unbuffered private I/O API
static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence)
AVCodecParameters * codecpar
Codec parameters associated with this stream.
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
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_parse_packet(RTPDemuxContext *s, AVPacket *pkt, uint8_t **bufptr, int len)
Parse an RTP or RTCP packet directly sent as a buffer.
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.
This structure stores compressed data.
const RTPDynamicProtocolHandler ff_ac3_dynamic_handler
static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
#define AV_NOPTS_VALUE
Undefined timestamp value.
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.
#define MIN_FEEDBACK_INTERVAL
static const RTPDynamicProtocolHandler speex_dynamic_handler