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 
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  snprintf(buf, sizeof (buf), "%d", s->ttl);
295  av_dict_set(&udp_opts, "ttl", buf, 0);
296  }
297 
298  ff_url_join(buf, sizeof (buf), "udp", NULL, hostname, rtp_port + 2, NULL);
299  if (ffurl_open_whitelist(&s->fec_col_hd, buf, flags, &h->interrupt_callback,
300  &udp_opts, h->protocol_whitelist, h->protocol_blacklist, h) < 0)
301  goto fail;
302  ff_url_join(buf, sizeof (buf), "udp", NULL, hostname, rtp_port + 4, NULL);
303  if (ffurl_open_whitelist(&s->fec_row_hd, buf, flags, &h->interrupt_callback,
304  &udp_opts, h->protocol_whitelist, h->protocol_blacklist, h) < 0)
305  goto fail;
306 
308  s->init = 1;
309 
310  av_dict_free(&udp_opts);
311  av_log(h, AV_LOG_INFO, "ProMPEG CoP#3-R2 FEC L=%d D=%d\n", s->l, s->d);
312  return 0;
313 
314 fail:
317  av_dict_free(&udp_opts);
318  return AVERROR(EIO);
319 }
320 
321 static int prompeg_init(URLContext *h, const uint8_t *buf, int size) {
322  PrompegContext *s = h->priv_data;
323  uint32_t seed;
324  int i;
325 
326  s->fec_arr = NULL;
327  s->rtp_buf = NULL;
328 
329  if (size < 12 || size > UINT16_MAX + 12) {
330  av_log(h, AV_LOG_ERROR, "Invalid RTP packet size\n");
331  return AVERROR_INVALIDDATA;
332  }
333 
334  s->packet_idx = 0;
335  s->packet_idx_max = s->l * s->d;
336  s->packet_size = size;
337  s->length_recovery = size - 12;
338  s->rtp_buf_size = 28 + s->length_recovery; // 12 + 16: RTP + FEC headers
339  s->bitstring_size = 8 + s->length_recovery; // 8: P, X, CC, M, PT, SN, TS
340  s->fec_arr_len = 1 + 2 * s->l; // row + column tmp + column out
341 
342  if (h->flags & AVFMT_FLAG_BITEXACT) {
343  s->rtp_col_sn = 0;
344  s->rtp_row_sn = 0;
345  } else {
346  seed = av_get_random_seed();
347  s->rtp_col_sn = seed & 0x0fff;
348  s->rtp_row_sn = (seed >> 16) & 0x0fff;
349  }
350 
351  s->fec_arr = av_malloc_array(s->fec_arr_len, sizeof (PrompegFec*));
352  if (!s->fec_arr) {
353  goto fail;
354  }
355  for (i = 0; i < s->fec_arr_len; i++) {
356  s->fec_arr[i] = av_malloc(sizeof (PrompegFec));
357  if (!s->fec_arr[i]) {
358  goto fail;
359  }
361  if (!s->fec_arr[i]->bitstring) {
362  av_freep(&s->fec_arr[i]);
363  goto fail;
364  }
365  }
366  s->fec_row = *s->fec_arr;
367  s->fec_col = s->fec_arr + 1;
368  s->fec_col_tmp = s->fec_arr + 1 + s->l;
369 
370  s->rtp_buf = av_malloc_array(s->rtp_buf_size, sizeof (uint8_t));
371  if (!s->rtp_buf) {
372  goto fail;
373  }
374  memset(s->rtp_buf, 0, s->rtp_buf_size);
375 
376  s->init = 0;
377  s->first = 1;
378 
379  return 0;
380 
381 fail:
382  av_log(h, AV_LOG_ERROR, "Failed to allocate the FEC buffer\n");
383  return AVERROR(ENOMEM);
384 }
385 
386 static int prompeg_write(URLContext *h, const uint8_t *buf, int size) {
387  PrompegContext *s = h->priv_data;
388  PrompegFec *fec_tmp;
390  int col_idx, col_out_idx, row_idx;
391  int ret, written = 0;
392 
393  if (s->init && ((ret = prompeg_init(h, buf, size)) < 0))
394  goto end;
395 
396  if ((ret = prompeg_create_bitstring(h, buf, size, &bitstring)) < 0)
397  goto end;
398 
399  col_idx = s->packet_idx % s->l;
400  row_idx = s->packet_idx / s->l % s->d;
401 
402  // FEC' (row) send block-aligned, xor
403  if (col_idx == 0) {
404  if (!s->first || s->packet_idx > 0) {
405  if ((ret = prompeg_write_fec(h, s->fec_row, PROMPEG_FEC_ROW)) < 0)
406  goto end;
407  written += ret;
408  }
409  memcpy(s->fec_row->bitstring, bitstring, s->bitstring_size);
410  s->fec_row->sn = AV_RB16(buf + 2);
411  s->fec_row->ts = AV_RB32(buf + 4);
412  } else {
413  xor_fast(s->fec_row->bitstring, bitstring, s->fec_row->bitstring,
414  s->bitstring_size);
415  }
416 
417  // FEC (column) xor
418  if (row_idx == 0) {
419  if (!s->first) {
420  // swap fec_col and fec_col_tmp
421  fec_tmp = s->fec_col[col_idx];
422  s->fec_col[col_idx] = s->fec_col_tmp[col_idx];
423  s->fec_col_tmp[col_idx] = fec_tmp;
424  }
425  memcpy(s->fec_col_tmp[col_idx]->bitstring, bitstring, s->bitstring_size);
426  s->fec_col_tmp[col_idx]->sn = AV_RB16(buf + 2);
427  s->fec_col_tmp[col_idx]->ts = AV_RB32(buf + 4);
428  } else {
429  xor_fast(s->fec_col_tmp[col_idx]->bitstring, bitstring,
430  s->fec_col_tmp[col_idx]->bitstring, s->bitstring_size);
431  }
432 
433  // FEC (column) send block-aligned
434  if (!s->first && s->packet_idx % s->d == 0) {
435  col_out_idx = s->packet_idx / s->d;
436  if ((ret = prompeg_write_fec(h, s->fec_col[col_out_idx], PROMPEG_FEC_COL)) < 0)
437  goto end;
438  written += ret;
439  }
440 
441  if (++s->packet_idx >= s->packet_idx_max) {
442  s->packet_idx = 0;
443  if (s->first)
444  s->first = 0;
445  }
446 
447  ret = written;
448 
449 end:
450  av_free(bitstring);
451  return ret;
452 }
453 
454 static int prompeg_close(URLContext *h) {
455  PrompegContext *s = h->priv_data;
456  int i;
457 
460 
461  if (s->fec_arr) {
462  for (i = 0; i < s->fec_arr_len; i++) {
463  av_free(s->fec_arr[i]->bitstring);
464  av_freep(&s->fec_arr[i]);
465  }
466  av_freep(&s->fec_arr);
467  }
468  av_freep(&s->rtp_buf);
469 
470  return 0;
471 }
472 
474  .name = "prompeg",
475  .url_open = prompeg_open,
476  .url_write = prompeg_write,
477  .url_close = prompeg_close,
478  .priv_data_size = sizeof(PrompegContext),
480  .priv_data_class = &prompeg_class,
481 };
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:4728
#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:307
#define URL_PROTOCOL_FLAG_NETWORK
Definition: url.h:34
URLContext * fec_col_hd
Definition: prompeg.c:104
AVOption.
Definition: opt.h:246
#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:421
AVIOInterruptCB interrupt_callback
Definition: url.h:47
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191
#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:87
#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:90
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:87
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:1506
#define AV_WB16(p, v)
Definition: intreadwrite.h:405
static int prompeg_init(URLContext *h, const uint8_t *buf, int size)
Definition: prompeg.c:321
#define av_log(a,...)
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:260
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
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:473
#define OFFSET(x)
Definition: prompeg.c:120
int fec_arr_len
Definition: prompeg.c:113
#define fail()
Definition: checkasm.h:120
#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
int n
Definition: avisynth_c.h:760
#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:444
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:36
#define AV_LOG_INFO
Standard information.
Definition: log.h:187
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
void * buf
Definition: avisynth_c.h:766
Definition: url.h:38
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:70
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
#define snprintf
Definition: snprintf.h:34
static int prompeg_close(URLContext *h)
Definition: prompeg.c:454
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:561
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.
static int prompeg_write(URLContext *h, const uint8_t *buf, int size)
Definition: prompeg.c:386
#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
uint8_t l
Definition: prompeg.c:107