FFmpeg
rtpenc.c
Go to the documentation of this file.
1 /*
2  * RTP output format
3  * Copyright (c) 2002 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "avformat.h"
23 #include "libavutil/attributes.h"
24 #include "mpegts.h"
25 #include "internal.h"
26 #include "mux.h"
27 #include "libavutil/mathematics.h"
28 #include "libavutil/mem.h"
29 #include "libavutil/random_seed.h"
30 #include "libavutil/opt.h"
31 
32 #include "rtpenc.h"
33 
34 static const AVOption options[] = {
36  { "payload_type", "Specify RTP payload type", offsetof(RTPMuxContext, payload_type), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 127, AV_OPT_FLAG_ENCODING_PARAM },
37  { "ssrc", "Stream identifier", offsetof(RTPMuxContext, ssrc), AV_OPT_TYPE_UINT, { .i64 = 0 }, 0, UINT32_MAX, AV_OPT_FLAG_ENCODING_PARAM },
38  { "cname", "CNAME to include in RTCP SR packets", offsetof(RTPMuxContext, cname), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
39  { "seq", "Starting sequence number", offsetof(RTPMuxContext, seq), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 65535, AV_OPT_FLAG_ENCODING_PARAM },
40  { NULL },
41 };
42 
43 static const AVClass rtp_muxer_class = {
44  .class_name = "RTP muxer",
45  .item_name = av_default_item_name,
46  .option = options,
47  .version = LIBAVUTIL_VERSION_INT,
48 };
49 
50 #define RTCP_SR_SIZE 28
51 
52 static int is_supported(enum AVCodecID id)
53 {
54  switch(id) {
55  case AV_CODEC_ID_DIRAC:
56  case AV_CODEC_ID_H261:
57  case AV_CODEC_ID_H263:
58  case AV_CODEC_ID_H263P:
59  case AV_CODEC_ID_H264:
60  case AV_CODEC_ID_HEVC:
63  case AV_CODEC_ID_MPEG4:
64  case AV_CODEC_ID_AAC:
65  case AV_CODEC_ID_MP2:
66  case AV_CODEC_ID_MP3:
69  case AV_CODEC_ID_PCM_S8:
75  case AV_CODEC_ID_PCM_U8:
77  case AV_CODEC_ID_AMR_NB:
78  case AV_CODEC_ID_AMR_WB:
79  case AV_CODEC_ID_VORBIS:
80  case AV_CODEC_ID_THEORA:
81  case AV_CODEC_ID_VP8:
82  case AV_CODEC_ID_VP9:
83  case AV_CODEC_ID_AV1:
87  case AV_CODEC_ID_ILBC:
88  case AV_CODEC_ID_MJPEG:
89  case AV_CODEC_ID_SPEEX:
90  case AV_CODEC_ID_OPUS:
93  case AV_CODEC_ID_G728:
94  return 1;
95  default:
96  return 0;
97  }
98 }
99 
101 {
102  RTPMuxContext *s = s1->priv_data;
103  int n, ret = AVERROR(EINVAL);
104  AVStream *st;
105 
106  if (s1->nb_streams != 1) {
107  av_log(s1, AV_LOG_ERROR, "Only one stream supported in the RTP muxer\n");
108  return AVERROR(EINVAL);
109  }
110  st = s1->streams[0];
111  if (!is_supported(st->codecpar->codec_id)) {
112  av_log(s1, AV_LOG_ERROR, "Unsupported codec %s\n", avcodec_get_name(st->codecpar->codec_id));
113 
114  return -1;
115  }
116 
117  if (s->payload_type < 0) {
118  /* Re-validate non-dynamic payload types */
119  if (st->id < RTP_PT_PRIVATE)
120  st->id = ff_rtp_get_payload_type(s1, st->codecpar, -1);
121 
122  s->payload_type = st->id;
123  } else {
124  /* private option takes priority */
125  st->id = s->payload_type;
126  }
127 
128  s->base_timestamp = av_get_random_seed();
129  s->timestamp = s->base_timestamp;
130  s->cur_timestamp = 0;
131  if (!s->ssrc)
132  s->ssrc = av_get_random_seed();
133  s->first_packet = 1;
134  s->first_rtcp_ntp_time = ff_ntp_time();
136  /* Round the NTP time to whole milliseconds. */
137  s->first_rtcp_ntp_time = (s1->start_time_realtime / 1000) * 1000 +
139  // Pick a random sequence start number, but in the lower end of the
140  // available range, so that any wraparound doesn't happen immediately.
141  // (Immediate wraparound would be an issue for SRTP.)
142  if (s->seq < 0) {
143  if (s1->flags & AVFMT_FLAG_BITEXACT) {
144  s->seq = 0;
145  } else
146  s->seq = av_get_random_seed() & 0x0fff;
147  } else
148  s->seq &= 0xffff; // Use the given parameter, wrapped to the right interval
149 
150  if (s1->packet_size) {
151  if (s1->pb->max_packet_size)
152  s1->packet_size = FFMIN(s1->packet_size,
153  s1->pb->max_packet_size);
154  } else
155  s1->packet_size = s1->pb->max_packet_size;
156  if (s1->packet_size <= 12) {
157  av_log(s1, AV_LOG_ERROR, "Max packet size %u too low\n", s1->packet_size);
158  return AVERROR(EIO);
159  }
160  s->buf = av_malloc(s1->packet_size);
161  if (!s->buf) {
162  return AVERROR(ENOMEM);
163  }
164  s->max_payload_size = s1->packet_size - 12;
165 
166  if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
167  avpriv_set_pts_info(st, 32, 1, st->codecpar->sample_rate);
168  } else {
169  avpriv_set_pts_info(st, 32, 1, 90000);
170  }
171  s->buf_ptr = s->buf;
172  switch(st->codecpar->codec_id) {
173  case AV_CODEC_ID_MP2:
174  case AV_CODEC_ID_MP3:
175  s->buf_ptr = s->buf + 4;
176  avpriv_set_pts_info(st, 32, 1, 90000);
177  break;
180  break;
181  case AV_CODEC_ID_MPEG2TS:
182  if (s->max_payload_size < TS_PACKET_SIZE) {
183  av_log(s1, AV_LOG_ERROR,
184  "RTP payload size %u too small for MPEG-TS "
185  "(minimum %d bytes required)\n",
186  s->max_payload_size, TS_PACKET_SIZE);
187  ret = AVERROR(EINVAL);
188  goto fail;
189  }
190 
191  n = s->max_payload_size / TS_PACKET_SIZE;
192  s->max_payload_size = n * TS_PACKET_SIZE;
193  break;
194  case AV_CODEC_ID_DIRAC:
197  "Packetizing VC-2 is experimental and does not use all values "
198  "of the specification "
199  "(even though most receivers may handle it just fine). "
200  "Please set -strict experimental in order to enable it.\n");
202  goto fail;
203  }
204  break;
205  case AV_CODEC_ID_H261:
208  "Packetizing H.261 is experimental and produces incorrect "
209  "packetization for cases where GOBs don't fit into packets "
210  "(even though most receivers may handle it just fine). "
211  "Please set -f_strict experimental in order to enable it.\n");
213  goto fail;
214  }
215  break;
216  case AV_CODEC_ID_H264:
217  /* check for H.264 MP4 syntax */
218  if (st->codecpar->extradata_size > 4 && st->codecpar->extradata[0] == 1) {
219  s->nal_length_size = (st->codecpar->extradata[4] & 0x03) + 1;
220  }
221  break;
222  case AV_CODEC_ID_HEVC:
223  /* Only check for the standardized hvcC version of extradata, keeping
224  * things simple and similar to the avcC/H.264 case above, instead
225  * of trying to handle the pre-standardization versions (as in
226  * libavcodec/hevc.c). */
227  if (st->codecpar->extradata_size > 21 && st->codecpar->extradata[0] == 1) {
228  s->nal_length_size = (st->codecpar->extradata[21] & 0x03) + 1;
229  }
230  break;
231  case AV_CODEC_ID_MJPEG:
234  if (st->codecpar->width <= 0 || st->codecpar->height <= 0) {
235  av_log(s1, AV_LOG_ERROR, "dimensions not set\n");
236  return AVERROR(EINVAL);
237  }
238  break;
239  case AV_CODEC_ID_VP9:
242  "Packetizing VP9 is experimental and its specification is "
243  "still in draft state. "
244  "Please set -strict experimental in order to enable it.\n");
246  goto fail;
247  }
248  break;
249  case AV_CODEC_ID_AV1:
252  "Packetizing AV1 is experimental and its specification is "
253  "still in draft state. "
254  "Please set -strict experimental in order to enable it.\n");
256  goto fail;
257  }
258  break;
259  case AV_CODEC_ID_VORBIS:
260  case AV_CODEC_ID_THEORA:
261  s->max_frames_per_packet = 15;
262  break;
264  /* Due to a historical error, the clock rate for G722 in RTP is
265  * 8000, even if the sample rate is 16000. See RFC 3551. */
266  avpriv_set_pts_info(st, 32, 1, 8000);
267  break;
268  case AV_CODEC_ID_OPUS:
269  if (st->codecpar->ch_layout.nb_channels > 2) {
270  av_log(s1, AV_LOG_ERROR, "Multistream opus not supported in RTP\n");
271  goto fail;
272  }
273  /* The opus RTP RFC says that all opus streams should use 48000 Hz
274  * as clock rate, since all opus sample rates can be expressed in
275  * this clock rate, and sample rate changes on the fly are supported. */
276  avpriv_set_pts_info(st, 32, 1, 48000);
277  break;
278  case AV_CODEC_ID_ILBC:
279  if (st->codecpar->block_align != 38 && st->codecpar->block_align != 50) {
280  av_log(s1, AV_LOG_ERROR, "Incorrect iLBC block size specified\n");
281  goto fail;
282  }
283  s->max_frames_per_packet = s->max_payload_size / st->codecpar->block_align;
284  break;
285  case AV_CODEC_ID_AMR_NB:
286  case AV_CODEC_ID_AMR_WB:
287  s->max_frames_per_packet = 50;
289  n = 31;
290  else
291  n = 61;
292  /* max_header_toc_size + the largest AMR payload must fit */
293  if (1 + s->max_frames_per_packet + n > s->max_payload_size) {
294  av_log(s1, AV_LOG_ERROR, "RTP max payload size too small for AMR\n");
295  goto fail;
296  }
297  if (st->codecpar->ch_layout.nb_channels != 1) {
298  av_log(s1, AV_LOG_ERROR, "Only mono is supported\n");
299  goto fail;
300  }
301  break;
302  case AV_CODEC_ID_AAC:
303  s->max_frames_per_packet = 50;
304  break;
305  default:
306  break;
307  }
308 
309  return 0;
310 
311 fail:
312  av_freep(&s->buf);
313  return ret;
314 }
315 
316 /* send an rtcp sender report packet */
317 static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time, int bye)
318 {
319  RTPMuxContext *s = s1->priv_data;
320  uint32_t rtp_ts;
321 
322  av_log(s1, AV_LOG_TRACE, "RTCP: %02x %"PRIx64" %"PRIx32"\n", s->payload_type, ntp_time, s->timestamp);
323 
324  s->last_rtcp_ntp_time = ntp_time;
325  rtp_ts = av_rescale_q(ntp_time - s->first_rtcp_ntp_time, (AVRational){1, 1000000},
326  s1->streams[0]->time_base) + s->base_timestamp;
327  avio_w8(s1->pb, RTP_VERSION << 6);
328  avio_w8(s1->pb, RTCP_SR);
329  avio_wb16(s1->pb, 6); /* length in words - 1 */
330  avio_wb32(s1->pb, s->ssrc);
331  avio_wb32(s1->pb, ntp_time / 1000000);
332  avio_wb32(s1->pb, ((ntp_time % 1000000) << 32) / 1000000);
333  avio_wb32(s1->pb, rtp_ts);
334  avio_wb32(s1->pb, s->packet_count);
335  avio_wb32(s1->pb, s->octet_count);
336 
337  if (s->cname) {
338  int len = FFMIN(strlen(s->cname), 255);
339  avio_w8(s1->pb, (RTP_VERSION << 6) + 1);
340  avio_w8(s1->pb, RTCP_SDES);
341  avio_wb16(s1->pb, (7 + len + 3) / 4); /* length in words - 1 */
342 
343  avio_wb32(s1->pb, s->ssrc);
344  avio_w8(s1->pb, 0x01); /* CNAME */
345  avio_w8(s1->pb, len);
346  avio_write(s1->pb, s->cname, len);
347  avio_w8(s1->pb, 0); /* END */
348  for (len = (7 + len) % 4; len % 4; len++)
349  avio_w8(s1->pb, 0);
350  }
351 
352  if (bye) {
353  avio_w8(s1->pb, (RTP_VERSION << 6) | 1);
354  avio_w8(s1->pb, RTCP_BYE);
355  avio_wb16(s1->pb, 1); /* length in words - 1 */
356  avio_wb32(s1->pb, s->ssrc);
357  }
358 
359  avio_flush(s1->pb);
360 }
361 
362 /* send an rtp packet. sequence number is incremented, but the caller
363  must update the timestamp itself */
364 void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
365 {
366  RTPMuxContext *s = s1->priv_data;
367 
368  av_log(s1, AV_LOG_TRACE, "rtp_send_data size=%d\n", len);
369 
370  /* build the RTP header */
371  avio_w8(s1->pb, RTP_VERSION << 6);
372  avio_w8(s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7));
373  avio_wb16(s1->pb, s->seq);
374  avio_wb32(s1->pb, s->timestamp);
375  avio_wb32(s1->pb, s->ssrc);
376 
377  avio_write(s1->pb, buf1, len);
378  avio_flush(s1->pb);
379 
380  s->seq = (s->seq + 1) & 0xffff;
381  s->octet_count += len;
382  s->packet_count++;
383 }
384 
385 /* send an integer number of samples and compute time stamp and fill
386  the rtp send buffer before sending. */
388  const uint8_t *buf1, int size, int sample_size_bits)
389 {
390  RTPMuxContext *s = s1->priv_data;
391  int len, max_packet_size, n;
392  /* Calculate the number of bytes to get samples aligned on a byte border */
393  int aligned_samples_size = sample_size_bits/av_gcd(sample_size_bits, 8);
394 
395  max_packet_size = (s->max_payload_size / aligned_samples_size) * aligned_samples_size;
396  /* Not needed, but who knows. Don't check if samples aren't an even number of bytes. */
397  if ((sample_size_bits % 8) == 0 && ((8 * size) % sample_size_bits) != 0)
398  return AVERROR(EINVAL);
399  n = 0;
400  while (size > 0) {
401  s->buf_ptr = s->buf;
402  len = FFMIN(max_packet_size, size);
403 
404  /* copy data */
405  memcpy(s->buf_ptr, buf1, len);
406  s->buf_ptr += len;
407  buf1 += len;
408  size -= len;
409  s->timestamp = s->cur_timestamp + n * 8 / sample_size_bits;
410  ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
411  n += (s->buf_ptr - s->buf);
412  }
413  return 0;
414 }
415 
417  const uint8_t *buf1, int size)
418 {
419  RTPMuxContext *s = s1->priv_data;
420  int len, count, max_packet_size;
421 
422  max_packet_size = s->max_payload_size;
423 
424  /* test if we must flush because not enough space */
425  len = (s->buf_ptr - s->buf);
426  if ((len + size) > max_packet_size) {
427  if (len > 4) {
428  ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
429  s->buf_ptr = s->buf + 4;
430  }
431  }
432  if (s->buf_ptr == s->buf + 4) {
433  s->timestamp = s->cur_timestamp;
434  }
435 
436  /* add the packet */
437  if (size > max_packet_size) {
438  /* big packet: fragment */
439  count = 0;
440  while (size > 0) {
441  len = max_packet_size - 4;
442  if (len > size)
443  len = size;
444  /* build fragmented packet */
445  s->buf[0] = 0;
446  s->buf[1] = 0;
447  s->buf[2] = count >> 8;
448  s->buf[3] = count;
449  memcpy(s->buf + 4, buf1, len);
450  ff_rtp_send_data(s1, s->buf, len + 4, 0);
451  size -= len;
452  buf1 += len;
453  count += len;
454  }
455  } else {
456  if (s->buf_ptr == s->buf + 4) {
457  /* no fragmentation possible */
458  s->buf[0] = 0;
459  s->buf[1] = 0;
460  s->buf[2] = 0;
461  s->buf[3] = 0;
462  }
463  memcpy(s->buf_ptr, buf1, size);
464  s->buf_ptr += size;
465  }
466 }
467 
469  const uint8_t *buf1, int size)
470 {
471  RTPMuxContext *s = s1->priv_data;
472  int len, max_packet_size;
473 
474  max_packet_size = s->max_payload_size;
475 
476  while (size > 0) {
477  len = max_packet_size;
478  if (len > size)
479  len = size;
480 
481  s->timestamp = s->cur_timestamp;
482  ff_rtp_send_data(s1, buf1, len, (len == size));
483 
484  buf1 += len;
485  size -= len;
486  }
487 }
488 
489 /* NOTE: size is assumed to be an integer multiple of TS_PACKET_SIZE */
491  const uint8_t *buf1, int size)
492 {
493  RTPMuxContext *s = s1->priv_data;
494  int len, out_len;
495 
496  s->timestamp = s->cur_timestamp;
497  while (size >= TS_PACKET_SIZE) {
498  len = s->max_payload_size - (s->buf_ptr - s->buf);
499  if (len > size)
500  len = size;
501  memcpy(s->buf_ptr, buf1, len);
502  buf1 += len;
503  size -= len;
504  s->buf_ptr += len;
505 
506  out_len = s->buf_ptr - s->buf;
507  if (out_len >= s->max_payload_size) {
508  ff_rtp_send_data(s1, s->buf, out_len, 0);
509  s->buf_ptr = s->buf;
510  }
511  }
512 }
513 
514 static int rtp_send_ilbc(AVFormatContext *s1, const uint8_t *buf, int size)
515 {
516  RTPMuxContext *s = s1->priv_data;
517  AVStream *st = s1->streams[0];
518  int frame_duration = av_get_audio_frame_duration2(st->codecpar, 0);
519  int frame_size = st->codecpar->block_align;
520  int frames = size / frame_size;
521 
522  while (frames > 0) {
523  if (s->num_frames > 0 &&
524  av_compare_ts(s->cur_timestamp - s->timestamp, st->time_base,
525  s1->max_delay, AV_TIME_BASE_Q) >= 0) {
526  ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 1);
527  s->num_frames = 0;
528  }
529 
530  if (!s->num_frames) {
531  s->buf_ptr = s->buf;
532  s->timestamp = s->cur_timestamp;
533  }
534  memcpy(s->buf_ptr, buf, frame_size);
535  frames--;
536  s->num_frames++;
537  s->buf_ptr += frame_size;
538  buf += frame_size;
539  s->cur_timestamp += frame_duration;
540 
541  if (s->num_frames == s->max_frames_per_packet) {
542  ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 1);
543  s->num_frames = 0;
544  }
545  }
546  return 0;
547 }
548 
550 {
551  RTPMuxContext *s = s1->priv_data;
552  AVStream *st = s1->streams[0];
553  int rtcp_bytes;
554  int size= pkt->size;
555 
556  av_log(s1, AV_LOG_TRACE, "%d: write len=%d\n", pkt->stream_index, size);
557 
558  rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
560  if ((s->first_packet || ((rtcp_bytes >= RTCP_SR_SIZE) &&
561  (ff_ntp_time() - s->last_rtcp_ntp_time > 5000000))) &&
562  !(s->flags & FF_RTP_FLAG_SKIP_RTCP)) {
563  rtcp_send_sr(s1, ff_ntp_time(), 0);
564  s->last_octet_count = s->octet_count;
565  s->first_packet = 0;
566  }
567  s->cur_timestamp = s->base_timestamp + pkt->pts;
568 
569  switch(st->codecpar->codec_id) {
572  case AV_CODEC_ID_PCM_U8:
573  case AV_CODEC_ID_PCM_S8:
574  return rtp_send_samples(s1, pkt->data, size, 8 * st->codecpar->ch_layout.nb_channels);
579  return rtp_send_samples(s1, pkt->data, size, 16 * st->codecpar->ch_layout.nb_channels);
581  return rtp_send_samples(s1, pkt->data, size, 24 * st->codecpar->ch_layout.nb_channels);
583  /* The actual sample size is half a byte per sample, but since the
584  * stream clock rate is 8000 Hz while the sample rate is 16000 Hz,
585  * the correct parameter for send_samples_bits is 8 bits per stream
586  * clock. */
587  return rtp_send_samples(s1, pkt->data, size, 8 * st->codecpar->ch_layout.nb_channels);
590  return rtp_send_samples(s1, pkt->data, size,
592  case AV_CODEC_ID_MP2:
593  case AV_CODEC_ID_MP3:
595  break;
599  break;
600  case AV_CODEC_ID_AAC:
601  if (s->flags & FF_RTP_FLAG_MP4A_LATM)
602  ff_rtp_send_latm(s1, pkt->data, size);
603  else
604  ff_rtp_send_aac(s1, pkt->data, size);
605  break;
606  case AV_CODEC_ID_AMR_NB:
607  case AV_CODEC_ID_AMR_WB:
608  ff_rtp_send_amr(s1, pkt->data, size);
609  break;
610  case AV_CODEC_ID_AV1:
611  ff_rtp_send_av1(s1, pkt->data, size, (pkt->flags & AV_PKT_FLAG_KEY) ? 1 : 0);
612  break;
613  case AV_CODEC_ID_MPEG2TS:
615  break;
616  case AV_CODEC_ID_DIRAC:
618  break;
619  case AV_CODEC_ID_H264:
621  break;
622  case AV_CODEC_ID_H261:
623  ff_rtp_send_h261(s1, pkt->data, size);
624  break;
625  case AV_CODEC_ID_H263:
626  if (s->flags & FF_RTP_FLAG_RFC2190) {
627  size_t mb_info_size;
628  const uint8_t *mb_info =
630  &mb_info_size);
631  ff_rtp_send_h263_rfc2190(s1, pkt->data, size, mb_info, mb_info_size);
632  break;
633  }
635  case AV_CODEC_ID_H263P:
636  ff_rtp_send_h263(s1, pkt->data, size);
637  break;
638  case AV_CODEC_ID_HEVC:
640  break;
641  case AV_CODEC_ID_VORBIS:
642  case AV_CODEC_ID_THEORA:
643  ff_rtp_send_xiph(s1, pkt->data, size);
644  break;
645  case AV_CODEC_ID_VP8:
646  ff_rtp_send_vp8(s1, pkt->data, size);
647  break;
648  case AV_CODEC_ID_VP9:
649  ff_rtp_send_vp9(s1, pkt->data, size);
650  break;
651  case AV_CODEC_ID_ILBC:
652  rtp_send_ilbc(s1, pkt->data, size);
653  break;
654  case AV_CODEC_ID_MJPEG:
655  ff_rtp_send_jpeg(s1, pkt->data, size);
656  break;
658  case AV_CODEC_ID_RAWVIDEO: {
660 
662  if (interlaced)
664  break;
665  }
666  case AV_CODEC_ID_OPUS:
667  if (size > s->max_payload_size) {
668  av_log(s1, AV_LOG_ERROR,
669  "Packet size %d too large for max RTP payload size %d\n",
670  size, s->max_payload_size);
671  return AVERROR(EINVAL);
672  }
674  default:
675  /* better than nothing : send the codec raw data */
676  rtp_send_raw(s1, pkt->data, size);
677  break;
678  }
679  return 0;
680 }
681 
683 {
684  RTPMuxContext *s = s1->priv_data;
685 
686  /* If the caller closes and recreates ->pb, this might actually
687  * be NULL here even if it was successfully allocated at the start. */
688  if (s1->pb && (s->flags & FF_RTP_FLAG_SEND_BYE))
689  rtcp_send_sr(s1, ff_ntp_time(), 1);
690 
691  return 0;
692 }
693 
694 static void rtp_deinit(AVFormatContext *s1)
695 {
696  RTPMuxContext *s = s1->priv_data;
697 
698  av_freep(&s->buf);
699 }
700 
702  .p.name = "rtp",
703  .p.long_name = NULL_IF_CONFIG_SMALL("RTP output"),
704  .priv_data_size = sizeof(RTPMuxContext),
705  .p.audio_codec = AV_CODEC_ID_PCM_MULAW,
706  .p.video_codec = AV_CODEC_ID_MPEG4,
707  .write_header = rtp_write_header,
708  .write_packet = rtp_write_packet,
709  .write_trailer = rtp_write_trailer,
710  .deinit = rtp_deinit,
711  .p.priv_class = &rtp_muxer_class,
713 };
AV_CODEC_ID_PCM_S16LE
@ AV_CODEC_ID_PCM_S16LE
Definition: codec_id.h:338
flags
const SwsFlags flags[]
Definition: swscale.c:72
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:71
ff_rtp_send_aac
void ff_rtp_send_aac(AVFormatContext *s1, const uint8_t *buff, int size)
Definition: rtpenc_aac.c:27
AVERROR_EXPERIMENTAL
#define AVERROR_EXPERIMENTAL
Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it.
Definition: error.h:74
rtp_write_header
static int rtp_write_header(AVFormatContext *s1)
Definition: rtpenc.c:100
ff_ntp_time
uint64_t ff_ntp_time(void)
Get the current time since NTP epoch in microseconds.
Definition: utils.c:257
FF_RTP_FLAG_MP4A_LATM
#define FF_RTP_FLAG_MP4A_LATM
Definition: rtpenc.h:68
AVCodecParameters::av_get_audio_frame_duration2
int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes)
This function is the same as av_get_audio_frame_duration(), except it works with AVCodecParameters in...
Definition: utils.c:816
AVOutputFormat::name
const char * name
Definition: avformat.h:506
AVERROR
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
opt.h
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:53
ff_rtp_send_jpeg
void ff_rtp_send_jpeg(AVFormatContext *s1, const uint8_t *buff, int size)
Definition: rtpenc_jpeg.c:28
mpegts.h
av_compare_ts
int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b)
Compare two timestamps each in its own time base.
Definition: mathematics.c:147
AVFMT_NODIMENSIONS
#define AVFMT_NODIMENSIONS
Format does not need width/height.
Definition: avformat.h:482
ff_rtp_send_h263_rfc2190
void ff_rtp_send_h263_rfc2190(AVFormatContext *s1, const uint8_t *buf1, int size, const uint8_t *mb_info, int mb_info_size)
Definition: rtpenc_h263_rfc2190.c:101
ff_rtp_send_h261
void ff_rtp_send_h261(AVFormatContext *s1, const uint8_t *buf1, int size)
Definition: rtpenc_h261.c:39
RTP_VERSION
#define RTP_VERSION
Definition: rtp.h:80
AV_FIELD_PROGRESSIVE
@ AV_FIELD_PROGRESSIVE
Definition: defs.h:213
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:263
AV_CODEC_ID_DIRAC
@ AV_CODEC_ID_DIRAC
Definition: codec_id.h:168
int64_t
long long int64_t
Definition: coverity.c:34
AV_CODEC_ID_RAWVIDEO
@ AV_CODEC_ID_RAWVIDEO
Definition: codec_id.h:65
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:64
ff_rtp_send_av1
void ff_rtp_send_av1(AVFormatContext *s1, const uint8_t *buf1, int size, int is_keyframe)
Definition: rtpenc_av1.c:42
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1331
AVFormatContext::strict_std_compliance
int strict_std_compliance
Allow non-standard and experimental extension.
Definition: avformat.h:1617
AVPacket::data
uint8_t * data
Definition: packet.h:595
AVOption
AVOption.
Definition: opt.h:429
AV_CODEC_ID_AMR_NB
@ AV_CODEC_ID_AMR_NB
Definition: codec_id.h:441
AV_CODEC_ID_ADPCM_G722
@ AV_CODEC_ID_ADPCM_G722
Definition: codec_id.h:405
ff_rtp_send_data
void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
Definition: rtpenc.c:364
AVIOContext::max_packet_size
int max_packet_size
Definition: avio.h:241
mathematics.h
FF_COMPLIANCE_EXPERIMENTAL
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
Definition: defs.h:62
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
FF_RTP_FLAG_RFC2190
#define FF_RTP_FLAG_RFC2190
Definition: rtpenc.h:69
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:650
FFOutputFormat::p
AVOutputFormat p
The public AVOutputFormat.
Definition: mux.h:65
FF_RTP_FLAG_OPTS
#define FF_RTP_FLAG_OPTS(ctx, fieldname)
Definition: rtpenc.h:74
AV_CODEC_ID_AMR_WB
@ AV_CODEC_ID_AMR_WB
Definition: codec_id.h:442
AV_CODEC_ID_H261
@ AV_CODEC_ID_H261
Definition: codec_id.h:55
av_get_random_seed
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
Definition: random_seed.c:196
av_gcd
int64_t av_gcd(int64_t a, int64_t b)
Compute the greatest common divisor of two integer operands.
Definition: mathematics.c:37
ff_rtp_send_mpegvideo
void ff_rtp_send_mpegvideo(AVFormatContext *s1, const uint8_t *buf1, int size)
Definition: rtpenc_mpv.c:29
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: avformat.c:781
AV_CODEC_ID_SPEEX
@ AV_CODEC_ID_SPEEX
Definition: codec_id.h:495
AV_CODEC_ID_PCM_S16BE
@ AV_CODEC_ID_PCM_S16BE
Definition: codec_id.h:339
fail
#define fail()
Definition: checkasm.h:224
frames
if it could not because there are no more frames
Definition: filter_design.txt:267
rtp_write_trailer
static int rtp_write_trailer(AVFormatContext *s1)
Definition: rtpenc.c:682
ff_rtp_send_latm
void ff_rtp_send_latm(AVFormatContext *s1, const uint8_t *buff, int size)
Definition: rtpenc_latm.c:25
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: codec_id.h:461
ff_rtp_send_raw_rfc4175
void ff_rtp_send_raw_rfc4175(AVFormatContext *s1, const uint8_t *buf, int size, int interlaced, int field)
Definition: rtpenc_rfc4175.c:24
FF_RTP_FLAG_SKIP_RTCP
#define FF_RTP_FLAG_SKIP_RTCP
Definition: rtpenc.h:70
rtp_send_ilbc
static int rtp_send_ilbc(AVFormatContext *s1, const uint8_t *buf, int size)
Definition: rtpenc.c:514
is_supported
static int is_supported(enum AVCodecID id)
Definition: rtpenc.c:52
options
static const AVOption options[]
Definition: rtpenc.c:34
AV_CODEC_ID_PCM_S8
@ AV_CODEC_ID_PCM_S8
Definition: codec_id.h:342
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:236
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
AV_CODEC_ID_ADPCM_G726
@ AV_CODEC_ID_ADPCM_G726
Definition: codec_id.h:388
RTCP_TX_RATIO_NUM
#define RTCP_TX_RATIO_NUM
Definition: rtp.h:84
s
#define s(width, name)
Definition: cbs_vp9.c:198
rtp_deinit
static void rtp_deinit(AVFormatContext *s1)
Definition: rtpenc.c:694
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1414
frame_size
int frame_size
Definition: mxfenc.c:2489
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
AV_CODEC_ID_VP9
@ AV_CODEC_ID_VP9
Definition: codec_id.h:222
AVCodecParameters::width
int width
The width of the video frame in pixels.
Definition: codec_par.h:143
AV_CODEC_ID_MP2
@ AV_CODEC_ID_MP2
Definition: codec_id.h:460
RTCP_TX_RATIO_DEN
#define RTCP_TX_RATIO_DEN
Definition: rtp.h:85
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
AV_CODEC_ID_PCM_MULAW
@ AV_CODEC_ID_PCM_MULAW
Definition: codec_id.h:344
AV_CODEC_ID_PCM_U16BE
@ AV_CODEC_ID_PCM_U16BE
Definition: codec_id.h:341
av_fallthrough
#define av_fallthrough
Definition: attributes.h:67
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:79
avio_flush
void avio_flush(AVIOContext *s)
Force flushing of buffered data.
Definition: aviobuf.c:228
AVFormatContext
Format I/O context.
Definition: avformat.h:1263
AV_CODEC_ID_PCM_ALAW
@ AV_CODEC_ID_PCM_ALAW
Definition: codec_id.h:345
internal.h
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:767
RTP_PT_PRIVATE
#define RTP_PT_PRIVATE
Definition: rtp.h:79
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:783
NULL
#define NULL
Definition: coverity.c:32
RTCP_SDES
@ RTCP_SDES
Definition: rtp.h:101
rtp_send_raw
static void rtp_send_raw(AVFormatContext *s1, const uint8_t *buf1, int size)
Definition: rtpenc.c:468
AV_CODEC_ID_AV1
@ AV_CODEC_ID_AV1
Definition: codec_id.h:284
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
AVFormatContext::pb
AVIOContext * pb
I/O context.
Definition: avformat.h:1305
options
Definition: swscale.c:45
FFOutputFormat
Definition: mux.h:61
AV_CODEC_ID_MPEG2TS
@ AV_CODEC_ID_MPEG2TS
FAKE codec to indicate a raw MPEG-2 TS stream (only used by libavformat)
Definition: codec_id.h:621
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:184
RTPMuxContext
Definition: rtpenc.h:27
AV_OPT_TYPE_UINT
@ AV_OPT_TYPE_UINT
Underlying C type is unsigned int.
Definition: opt.h:335
AV_CODEC_ID_G728
@ AV_CODEC_ID_G728
Definition: codec_id.h:567
rtp_muxer_class
static const AVClass rtp_muxer_class
Definition: rtpenc.c:43
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
The channel layout and number of channels.
Definition: codec_par.h:207
AV_OPT_FLAG_ENCODING_PARAM
#define AV_OPT_FLAG_ENCODING_PARAM
A generic parameter which can be set by the user for muxing or encoding.
Definition: opt.h:352
AVCodecParameters::sample_rate
int sample_rate
The number of audio samples per second.
Definition: codec_par.h:213
AV_CODEC_ID_MPEG1VIDEO
@ AV_CODEC_ID_MPEG1VIDEO
Definition: codec_id.h:53
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:75
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1319
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: codec_id.h:462
rtp_send_samples
static int rtp_send_samples(AVFormatContext *s1, const uint8_t *buf1, int size, int sample_size_bits)
Definition: rtpenc.c:387
AVPacket::size
int size
Definition: packet.h:596
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
AV_CODEC_ID_H263
@ AV_CODEC_ID_H263
Definition: codec_id.h:56
size
int size
Definition: twinvq_data.h:10344
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
NTP_OFFSET_US
#define NTP_OFFSET_US
Definition: internal.h:419
AV_CODEC_ID_OPUS
@ AV_CODEC_ID_OPUS
Definition: codec_id.h:520
rtp_send_mpegts_raw
static void rtp_send_mpegts_raw(AVFormatContext *s1, const uint8_t *buf1, int size)
Definition: rtpenc.c:490
avio_write
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:206
avio_wb32
void avio_wb32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:368
attributes.h
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:601
AV_CODEC_ID_BITPACKED
@ AV_CODEC_ID_BITPACKED
Definition: codec_id.h:285
RTCP_SR_SIZE
#define RTCP_SR_SIZE
Definition: rtpenc.c:50
rtcp_send_sr
static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time, int bye)
Definition: rtpenc.c:317
avcodec_get_name
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
Definition: utils.c:406
AV_CODEC_ID_MJPEG
@ AV_CODEC_ID_MJPEG
Definition: codec_id.h:59
interlaced
uint8_t interlaced
Definition: mxfenc.c:2336
AV_PKT_DATA_H263_MB_INFO
@ AV_PKT_DATA_H263_MB_INFO
An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of structures with info about macroblo...
Definition: packet.h:90
av_malloc
#define av_malloc(s)
Definition: ops_asmgen.c:44
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:588
av_packet_get_side_data
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, size_t *size)
Get side information from packet.
Definition: packet.c:252
AV_CODEC_ID_THEORA
@ AV_CODEC_ID_THEORA
Definition: codec_id.h:82
ff_rtp_send_vp8
void ff_rtp_send_vp8(AVFormatContext *s1, const uint8_t *buff, int size)
Definition: rtpenc_vp8.c:26
AVCodecParameters::height
int height
The height of the video frame in pixels.
Definition: codec_par.h:150
AVCodecParameters::block_align
int block_align
The number of bytes per coded audio frame, required by some formats.
Definition: codec_par.h:221
FF_RTP_FLAG_SEND_BYE
#define FF_RTP_FLAG_SEND_BYE
Definition: rtpenc.h:72
RTCP_BYE
@ RTCP_BYE
Definition: rtp.h:102
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:228
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AVFormatContext::max_delay
int max_delay
Definition: avformat.h:1408
ff_rtp_send_vp9
void ff_rtp_send_vp9(AVFormatContext *s1, const uint8_t *buff, int size)
Definition: rtpenc_vp9.c:26
len
int len
Definition: vorbis_enc_data.h:426
ff_rtp_send_vc2hq
void ff_rtp_send_vc2hq(AVFormatContext *s1, const uint8_t *buf, int size, int interlaced)
Definition: rtpenc_vc2hq.c:106
ff_rtp_muxer
const FFOutputFormat ff_rtp_muxer
Definition: rtpenc.c:701
rtpenc.h
AVCodecParameters::field_order
enum AVFieldOrder field_order
The order of the fields in interlaced video.
Definition: codec_par.h:182
AVFMT_TS_NONSTRICT
#define AVFMT_TS_NONSTRICT
Format does not require strictly increasing timestamps, but they must still be monotonic.
Definition: avformat.h:487
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:756
AVFMT_FLAG_BITEXACT
#define AVFMT_FLAG_BITEXACT
When muxing, try to avoid writing any random/volatile data to the output.
Definition: avformat.h:1431
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
avformat.h
ff_rtp_send_h264_hevc
void ff_rtp_send_h264_hevc(AVFormatContext *s1, const uint8_t *buf1, int size)
Definition: rtpenc_h264_hevc.c:181
ff_rtp_send_amr
void ff_rtp_send_amr(AVFormatContext *s1, const uint8_t *buff, int size)
Packetize AMR frames into RTP packets according to RFC 3267, in octet-aligned mode.
Definition: rtpenc_amr.c:30
AV_CODEC_ID_H263P
@ AV_CODEC_ID_H263P
Definition: codec_id.h:71
random_seed.h
AV_CODEC_ID_ADPCM_G726LE
@ AV_CODEC_ID_ADPCM_G726LE
Definition: codec_id.h:412
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
ff_rtp_send_h263
void ff_rtp_send_h263(AVFormatContext *s1, const uint8_t *buf1, int size)
Packetize H.263 frames into RTP packets according to RFC 4629.
Definition: rtpenc_h263.c:43
RTCP_SR
@ RTCP_SR
Definition: rtp.h:99
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
AVPacket::stream_index
int stream_index
Definition: packet.h:597
rtp_write_packet
static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
Definition: rtpenc.c:549
AVFormatContext::packet_size
unsigned int packet_size
Definition: avformat.h:1407
AVCodecParameters::bits_per_coded_sample
int bits_per_coded_sample
The number of bits per sample in the codedwords.
Definition: codec_par.h:113
mem.h
AV_CODEC_ID_PCM_U8
@ AV_CODEC_ID_PCM_U8
Definition: codec_id.h:343
AVFormatContext::start_time_realtime
int64_t start_time_realtime
Start time of the stream in real world time, in microseconds since the Unix epoch (00:00 1st January ...
Definition: avformat.h:1508
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:57
AVPacket
This structure stores compressed data.
Definition: packet.h:572
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AV_CODEC_ID_ILBC
@ AV_CODEC_ID_ILBC
Definition: codec_id.h:519
AV_CODEC_ID_PCM_U16LE
@ AV_CODEC_ID_PCM_U16LE
Definition: codec_id.h:340
avio_wb16
void avio_wb16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:446
AV_CODEC_ID_VP8
@ AV_CODEC_ID_VP8
Definition: codec_id.h:192
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
TS_PACKET_SIZE
#define TS_PACKET_SIZE
Definition: mpegts.h:29
AV_CODEC_ID_VORBIS
@ AV_CODEC_ID_VORBIS
Definition: codec_id.h:465
ff_rtp_send_xiph
void ff_rtp_send_xiph(AVFormatContext *s1, const uint8_t *buff, int size)
Packetize Xiph frames into RTP according to RFC 5215 (Vorbis) and the Theora RFC draft.
Definition: rtpenc_xiph.c:33
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition: opt.h:276
rtp_send_mpegaudio
static void rtp_send_mpegaudio(AVFormatContext *s1, const uint8_t *buf1, int size)
Definition: rtpenc.c:416
AV_CODEC_ID_MPEG2VIDEO
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition: codec_id.h:54
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1291
AV_CODEC_ID_PCM_S24BE
@ AV_CODEC_ID_PCM_S24BE
Definition: codec_id.h:351
mb_info
Definition: cinepakenc.c:87
ff_rtp_get_payload_type
int ff_rtp_get_payload_type(const AVFormatContext *fmt, const AVCodecParameters *par, int idx)
Return the payload type for a given stream used in the given format context.
Definition: rtp.c:93
mux.h