FFmpeg
prompeg.c
Go to the documentation of this file.
1 /*
2  * Pro-MPEG Code of Practice #3 Release 2 FEC
3  * Copyright (c) 2016 Mobibase, France (http://www.mobibase.com)
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 /**
23  * @file
24  * Pro-MPEG Code of Practice #3 Release 2 FEC protocol
25  * @author Vlad Tarca <vlad.tarca@gmail.com>
26  */
27 
28 /*
29  * Reminder:
30 
31  [RFC 2733] FEC Packet Structure
32 
33  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
34  | RTP Header |
35  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
36  | FEC Header |
37  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
38  | FEC Payload |
39  | |
40  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
41 
42 
43  [RFC 3550] RTP header
44 
45  0 1 2 3
46  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
47  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
48  |V=2|P|X| CC |M| PT | sequence number |
49  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50  | timestamp |
51  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52  | synchronization source (SSRC) identifier |
53  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
54  | contributing source (CSRC) identifiers |
55  | .... |
56  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
57 
58  [RFC 3550] RTP header extension (after CSRC)
59 
60  0 1 2 3
61  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
62  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63  | defined by profile | length |
64  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65  | header extension |
66  | .... |
67  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68 
69  [Pro-MPEG COP3] FEC Header
70 
71  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72  | SNBase low bits | length recovery |
73  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
74  |E| PT recovery | mask |
75  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
76  | TS recovery |
77  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
78  |X|D|type |index| offset | NA |SNBase ext bits|
79  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
80 
81  */
82 
83 #include "libavutil/avstring.h"
84 #include "libavutil/intreadwrite.h"
85 #include "libavutil/opt.h"
86 #include "libavutil/parseutils.h"
87 #include "libavutil/random_seed.h"
88 #include "avformat.h"
89 #include "config.h"
90 #include "url.h"
91 
92 #define PROMPEG_RTP_PT 0x60
93 #define PROMPEG_FEC_COL 0x0
94 #define PROMPEG_FEC_ROW 0x1
95 
96 typedef struct PrompegFec {
97  uint16_t sn;
98  uint32_t ts;
100 } PrompegFec;
101 
102 typedef struct PrompegContext {
103  const AVClass *class;
104  URLContext *fec_col_hd, *fec_row_hd;
105  PrompegFec **fec_arr, **fec_col_tmp, **fec_col, *fec_row;
106  int ttl;
107  uint8_t l, d;
109  uint16_t rtp_col_sn, rtp_row_sn;
110  uint16_t length_recovery;
112  int packet_idx, packet_idx_max;
116  int init;
117  int first;
119 
120 #define OFFSET(x) offsetof(PrompegContext, x)
121 #define E AV_OPT_FLAG_ENCODING_PARAM
122 
123 static const AVOption options[] = {
124  { "ttl", "Time to live (in milliseconds, multicast only)", OFFSET(ttl), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags = E },
125  { "l", "FEC L", OFFSET(l), AV_OPT_TYPE_INT, { .i64 = 5 }, 4, 20, .flags = E },
126  { "d", "FEC D", OFFSET(d), AV_OPT_TYPE_INT, { .i64 = 5 }, 4, 20, .flags = E },
127  { NULL }
128 };
129 
130 static const AVClass prompeg_class = {
131  .class_name = "prompeg",
132  .item_name = av_default_item_name,
133  .option = options,
134  .version = LIBAVUTIL_VERSION_INT,
135 };
136 
137 static void xor_fast(const uint8_t *in1, const uint8_t *in2, uint8_t *out, int size) {
138  int i, n, s;
139 
140 #if HAVE_FAST_64BIT
141  uint64_t v1, v2;
142 
143  n = size / sizeof (uint64_t);
144  s = n * sizeof (uint64_t);
145 
146  for (i = 0; i < n; i++) {
147  v1 = AV_RN64A(in1);
148  v2 = AV_RN64A(in2);
149  AV_WN64A(out, v1 ^ v2);
150  in1 += 8;
151  in2 += 8;
152  out += 8;
153  }
154 #else
155  uint32_t v1, v2;
156 
157  n = size / sizeof (uint32_t);
158  s = n * sizeof (uint32_t);
159 
160  for (i = 0; i < n; i++) {
161  v1 = AV_RN32A(in1);
162  v2 = AV_RN32A(in2);
163  AV_WN32A(out, v1 ^ v2);
164  in1 += 4;
165  in2 += 4;
166  out += 4;
167  }
168 #endif
169 
170  n = size - s;
171 
172  for (i = 0; i < n; i++) {
173  out[i] = in1[i] ^ in2[i];
174  }
175 }
176 
177 static int prompeg_create_bitstring(URLContext *h, const uint8_t *buf, int size,
178  uint8_t **bitstring) {
179  PrompegContext *s = h->priv_data;
180  uint8_t *b;
181 
182  if (size < 12 || (buf[0] & 0xc0) != 0x80 || (buf[1] & 0x7f) != 0x21) {
183  av_log(h, AV_LOG_ERROR, "Unsupported stream format (expected MPEG-TS over RTP)\n");
184  return AVERROR(EINVAL);
185  }
186  if (size != s->packet_size) {
187  av_log(h, AV_LOG_ERROR, "The RTP packet size must be constant (set pkt_size)\n");
188  return AVERROR(EINVAL);
189  }
190 
191  *bitstring = av_malloc(s->bitstring_size);
192  if (!*bitstring) {
193  av_log(h, AV_LOG_ERROR, "Failed to allocate the bitstring buffer\n");
194  return AVERROR(ENOMEM);
195  }
196  b = *bitstring;
197 
198  // P, X, CC
199  b[0] = buf[0] & 0x3f;
200  // M, PT
201  b[1] = buf[1];
202  // Timestamp
203  b[2] = buf[4];
204  b[3] = buf[5];
205  b[4] = buf[6];
206  b[5] = buf[7];
207  /*
208  * length_recovery: the unsigned network-ordered sum of lengths of CSRC,
209  * padding, extension and media payload
210  */
211  AV_WB16(b + 6, s->length_recovery);
212  // Payload
213  memcpy(b + 8, buf + 12, s->length_recovery);
214 
215  return 0;
216 }
217 
219  PrompegContext *s = h->priv_data;
220  URLContext *hd;
221  uint8_t *buf = s->rtp_buf; // zero-filled
222  uint8_t *b = fec->bitstring;
223  uint16_t sn;
224  int ret;
225 
226  sn = type == PROMPEG_FEC_COL ? ++s->rtp_col_sn : ++s->rtp_row_sn;
227 
228  // V, P, X, CC
229  buf[0] = 0x80 | (b[0] & 0x3f);
230  // M, PT
231  buf[1] = (b[1] & 0x80) | PROMPEG_RTP_PT;
232  // SN
233  AV_WB16(buf + 2, sn);
234  // TS
235  AV_WB32(buf + 4, fec->ts);
236  // CSRC=0
237  //AV_WB32(buf + 8, 0);
238  // SNBase low bits
239  AV_WB16(buf + 12, fec->sn);
240  // Length recovery
241  buf[14] = b[6];
242  buf[15] = b[7];
243  // E=1, PT recovery
244  buf[16] = 0x80 | b[1];
245  // Mask=0
246  //buf[17] = 0x0;
247  //buf[18] = 0x0;
248  //buf[19] = 0x0;
249  // TS recovery
250  buf[20] = b[2];
251  buf[21] = b[3];
252  buf[22] = b[4];
253  buf[23] = b[5];
254  // X=0, D, type=0, index=0
255  buf[24] = type == PROMPEG_FEC_COL ? 0x0 : 0x40;
256  // offset
257  buf[25] = type == PROMPEG_FEC_COL ? s->l : 0x1;
258  // NA
259  buf[26] = type == PROMPEG_FEC_COL ? s->d : s->l;
260  // SNBase ext bits=0
261  //buf[27] = 0x0;
262  // Payload
263  memcpy(buf + 28, b + 8, s->length_recovery);
264 
265  hd = type == PROMPEG_FEC_COL ? s->fec_col_hd : s->fec_row_hd;
266  ret = ffurl_write(hd, buf, s->rtp_buf_size);
267  return ret;
268 }
269 
270 static int prompeg_open(URLContext *h, const char *uri, int flags) {
271  PrompegContext *s = h->priv_data;
272  AVDictionary *udp_opts = NULL;
273  int rtp_port;
274  char hostname[256];
275  char buf[1024];
276 
277  s->fec_col_hd = NULL;
278  s->fec_row_hd = NULL;
279 
280  if (s->l * s->d > 100) {
281  av_log(h, AV_LOG_ERROR, "L * D must be <= 100\n");
282  return AVERROR(EINVAL);
283  }
284 
285  av_url_split(NULL, 0, NULL, 0, hostname, sizeof (hostname), &rtp_port,
286  NULL, 0, uri);
287 
288  if (rtp_port < 1 || rtp_port > UINT16_MAX - 4) {
289  av_log(h, AV_LOG_ERROR, "Invalid RTP base port %d\n", rtp_port);
290  return AVERROR(EINVAL);
291  }
292 
293  if (s->ttl > 0) {
294  av_dict_set_int(&udp_opts, "ttl", s->ttl, 0);
295  }
296 
297  ff_url_join(buf, sizeof (buf), "udp", NULL, hostname, rtp_port + 2, NULL);
298  if (ffurl_open_whitelist(&s->fec_col_hd, buf, flags, &h->interrupt_callback,
299  &udp_opts, h->protocol_whitelist, h->protocol_blacklist, h) < 0)
300  goto fail;
301  ff_url_join(buf, sizeof (buf), "udp", NULL, hostname, rtp_port + 4, NULL);
302  if (ffurl_open_whitelist(&s->fec_row_hd, buf, flags, &h->interrupt_callback,
303  &udp_opts, h->protocol_whitelist, h->protocol_blacklist, h) < 0)
304  goto fail;
305 
307  s->init = 1;
308 
309  av_dict_free(&udp_opts);
310  av_log(h, AV_LOG_INFO, "ProMPEG CoP#3-R2 FEC L=%d D=%d\n", s->l, s->d);
311  return 0;
312 
313 fail:
316  av_dict_free(&udp_opts);
317  return AVERROR(EIO);
318 }
319 
320 static int prompeg_init(URLContext *h, const uint8_t *buf, int size) {
321  PrompegContext *s = h->priv_data;
322  uint32_t seed;
323  int i;
324 
325  s->fec_arr = NULL;
326  s->rtp_buf = NULL;
327 
328  if (size < 12 || size > UINT16_MAX + 12) {
329  av_log(h, AV_LOG_ERROR, "Invalid RTP packet size\n");
330  return AVERROR_INVALIDDATA;
331  }
332 
333  s->packet_idx = 0;
334  s->packet_idx_max = s->l * s->d;
335  s->packet_size = size;
336  s->length_recovery = size - 12;
337  s->rtp_buf_size = 28 + s->length_recovery; // 12 + 16: RTP + FEC headers
338  s->bitstring_size = 8 + s->length_recovery; // 8: P, X, CC, M, PT, SN, TS
339  s->fec_arr_len = 1 + 2 * s->l; // row + column tmp + column out
340 
341  if (h->flags & AVFMT_FLAG_BITEXACT) {
342  s->rtp_col_sn = 0;
343  s->rtp_row_sn = 0;
344  } else {
345  seed = av_get_random_seed();
346  s->rtp_col_sn = seed & 0x0fff;
347  s->rtp_row_sn = (seed >> 16) & 0x0fff;
348  }
349 
350  s->fec_arr = av_malloc_array(s->fec_arr_len, sizeof (PrompegFec*));
351  if (!s->fec_arr) {
352  goto fail;
353  }
354  for (i = 0; i < s->fec_arr_len; i++) {
355  s->fec_arr[i] = av_malloc(sizeof (PrompegFec));
356  if (!s->fec_arr[i]) {
357  goto fail;
358  }
360  if (!s->fec_arr[i]->bitstring) {
361  av_freep(&s->fec_arr[i]);
362  goto fail;
363  }
364  }
365  s->fec_row = *s->fec_arr;
366  s->fec_col = s->fec_arr + 1;
367  s->fec_col_tmp = s->fec_arr + 1 + s->l;
368 
369  s->rtp_buf = av_malloc_array(s->rtp_buf_size, sizeof (uint8_t));
370  if (!s->rtp_buf) {
371  goto fail;
372  }
373  memset(s->rtp_buf, 0, s->rtp_buf_size);
374 
375  s->init = 0;
376  s->first = 1;
377 
378  return 0;
379 
380 fail:
381  av_log(h, AV_LOG_ERROR, "Failed to allocate the FEC buffer\n");
382  return AVERROR(ENOMEM);
383 }
384 
385 static int prompeg_write(URLContext *h, const uint8_t *buf, int size) {
386  PrompegContext *s = h->priv_data;
387  PrompegFec *fec_tmp;
389  int col_idx, col_out_idx, row_idx;
390  int ret = 0;
391 
392  if (s->init && ((ret = prompeg_init(h, buf, size)) < 0))
393  goto end;
394 
395  if ((ret = prompeg_create_bitstring(h, buf, size, &bitstring)) < 0)
396  goto end;
397 
398  col_idx = s->packet_idx % s->l;
399  row_idx = s->packet_idx / s->l % s->d;
400 
401  // FEC' (row) send block-aligned, xor
402  if (col_idx == 0) {
403  if (!s->first || s->packet_idx > 0) {
404  if ((ret = prompeg_write_fec(h, s->fec_row, PROMPEG_FEC_ROW)) < 0)
405  goto end;
406  }
407  memcpy(s->fec_row->bitstring, bitstring, s->bitstring_size);
408  s->fec_row->sn = AV_RB16(buf + 2);
409  s->fec_row->ts = AV_RB32(buf + 4);
410  } else {
411  xor_fast(s->fec_row->bitstring, bitstring, s->fec_row->bitstring,
412  s->bitstring_size);
413  }
414 
415  // FEC (column) xor
416  if (row_idx == 0) {
417  if (!s->first) {
418  // swap fec_col and fec_col_tmp
419  fec_tmp = s->fec_col[col_idx];
420  s->fec_col[col_idx] = s->fec_col_tmp[col_idx];
421  s->fec_col_tmp[col_idx] = fec_tmp;
422  }
423  memcpy(s->fec_col_tmp[col_idx]->bitstring, bitstring, s->bitstring_size);
424  s->fec_col_tmp[col_idx]->sn = AV_RB16(buf + 2);
425  s->fec_col_tmp[col_idx]->ts = AV_RB32(buf + 4);
426  } else {
427  xor_fast(s->fec_col_tmp[col_idx]->bitstring, bitstring,
428  s->fec_col_tmp[col_idx]->bitstring, s->bitstring_size);
429  }
430 
431  // FEC (column) send block-aligned
432  if (!s->first && s->packet_idx % s->d == 0) {
433  col_out_idx = s->packet_idx / s->d;
434  if ((ret = prompeg_write_fec(h, s->fec_col[col_out_idx], PROMPEG_FEC_COL)) < 0)
435  goto end;
436  }
437 
438  if (++s->packet_idx >= s->packet_idx_max) {
439  s->packet_idx = 0;
440  if (s->first)
441  s->first = 0;
442  }
443 
444  ret = size;
445 
446 end:
447  av_free(bitstring);
448  return ret;
449 }
450 
451 static int prompeg_close(URLContext *h) {
452  PrompegContext *s = h->priv_data;
453  int i;
454 
457 
458  if (s->fec_arr) {
459  for (i = 0; i < s->fec_arr_len; i++) {
460  av_free(s->fec_arr[i]->bitstring);
461  av_freep(&s->fec_arr[i]);
462  }
463  av_freep(&s->fec_arr);
464  }
465  av_freep(&s->rtp_buf);
466 
467  return 0;
468 }
469 
471  .name = "prompeg",
472  .url_open = prompeg_open,
473  .url_write = prompeg_write,
474  .url_close = prompeg_close,
475  .priv_data_size = sizeof(PrompegContext),
477  .priv_data_class = &prompeg_class,
478 };
void av_url_split(char *proto, int proto_size, char *authorization, int authorization_size, char *hostname, int hostname_size, int *port_ptr, char *path, int path_size, const char *url)
Split a URL string into components.
Definition: utils.c:4725
#define NULL
Definition: coverity.c:32
uint8_t * bitstring
Definition: prompeg.c:99
uint32_t ts
Definition: prompeg.c:98
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
int ffurl_open_whitelist(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, const char *whitelist, const char *blacklist, URLContext *parent)
Create an URLContext for accessing to the resource indicated by url, and open it. ...
Definition: avio.c:310
#define URL_PROTOCOL_FLAG_NETWORK
Definition: url.h:34
URLContext * fec_col_hd
Definition: prompeg.c:104
AVOption.
Definition: opt.h:248
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
uint8_t d
Definition: prompeg.c:107
URLContext * fec_row_hd
Definition: prompeg.c:104
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
Write size bytes from buf to the resource accessed by h.
Definition: avio.c:423
AVIOInterruptCB interrupt_callback
Definition: url.h:47
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
#define PROMPEG_FEC_ROW
Definition: prompeg.c:94
static int prompeg_open(URLContext *h, const char *uri, int flags)
Definition: prompeg.c:270
int packet_idx
Definition: prompeg.c:112
GLint GLenum type
Definition: opengl_enc.c:104
int bitstring_size
Definition: prompeg.c:114
int flags
Definition: url.h:43
int rtp_buf_size
Definition: prompeg.c:115
static const AVClass prompeg_class
Definition: prompeg.c:130
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
Definition: bytestream.h:91
#define AV_WN32A(p, v)
Definition: intreadwrite.h:538
uint16_t rtp_col_sn
Definition: prompeg.c:109
#define AV_RN32A(p)
Definition: intreadwrite.h:526
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:72
static const AVOption options[]
Definition: prompeg.c:123
uint8_t
#define av_malloc(s)
AVOptions.
#define PROMPEG_FEC_COL
Definition: prompeg.c:93
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:92
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
Definition: bytestream.h:91
uint8_t * rtp_buf
Definition: prompeg.c:108
ptrdiff_t size
Definition: opengl_enc.c:100
#define AVFMT_FLAG_BITEXACT
When muxing, try to avoid writing any random/volatile data to the output.
Definition: avformat.h:1387
#define AV_WB16(p, v)
Definition: intreadwrite.h:405
static int prompeg_init(URLContext *h, const uint8_t *buf, int size)
Definition: prompeg.c:320
#define av_log(a,...)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
const char * protocol_whitelist
Definition: url.h:49
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
Definition: dict.c:203
int packet_size
Definition: prompeg.c:111
const URLProtocol ff_prompeg_protocol
Definition: prompeg.c:470
#define OFFSET(x)
Definition: prompeg.c:120
int fec_arr_len
Definition: prompeg.c:113
#define fail()
Definition: checkasm.h:123
#define b
Definition: input.c:41
int packet_idx_max
Definition: prompeg.c:112
#define s(width, name)
Definition: cbs_vp9.c:257
uint16_t rtp_row_sn
Definition: prompeg.c:109
PrompegFec ** fec_arr
Definition: prompeg.c:105
#define AV_WN64A(p, v)
Definition: intreadwrite.h:542
int ffurl_closep(URLContext **hh)
Close the resource accessed by the URLContext h, and free the memory used by it.
Definition: avio.c:446
int ff_url_join(char *str, int size, const char *proto, const char *authorization, const char *hostname, int port, const char *fmt,...)
Definition: url.c:38
#define AV_LOG_INFO
Standard information.
Definition: log.h:205
const char * protocol_blacklist
Definition: url.h:50
PrompegFec ** fec_col_tmp
Definition: prompeg.c:105
PrompegFec * fec_row
Definition: prompeg.c:105
static unsigned int seed
Definition: videogen.c:78
static int prompeg_write_fec(URLContext *h, PrompegFec *fec, uint8_t type)
Definition: prompeg.c:218
Definition: url.h:38
Describe the class of an AVClass context structure.
Definition: log.h:67
#define AV_WB32(p, v)
Definition: intreadwrite.h:419
void * priv_data
Definition: url.h:41
static int prompeg_close(URLContext *h)
Definition: prompeg.c:451
misc parsing utilities
const char * name
Definition: url.h:55
PrompegFec ** fec_col
Definition: prompeg.c:105
#define flags(name, subs,...)
Definition: cbs_av1.c:560
static int prompeg_create_bitstring(URLContext *h, const uint8_t *buf, int size, uint8_t **bitstring)
Definition: prompeg.c:177
uint16_t length_recovery
Definition: prompeg.c:110
Main libavformat public API header.
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set that converts the value to a string and stores it...
Definition: dict.c:147
static int prompeg_write(URLContext *h, const uint8_t *buf, int size)
Definition: prompeg.c:385
#define PROMPEG_RTP_PT
Definition: prompeg.c:92
#define av_free(p)
uint16_t sn
Definition: prompeg.c:97
#define E
Definition: prompeg.c:121
int max_packet_size
if non zero, the stream is packetized with this max packet size
Definition: url.h:44
FILE * out
Definition: movenc.c:54
#define av_freep(p)
unbuffered private I/O API
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
Definition: random_seed.c:120
#define av_malloc_array(a, b)
static void xor_fast(const uint8_t *in1, const uint8_t *in2, uint8_t *out, int size)
Definition: prompeg.c:137
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
#define AV_RN64A(p)
Definition: intreadwrite.h:530
int i
Definition: input.c:407
uint8_t l
Definition: prompeg.c:107