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;
106  int ttl;
110  uint16_t length_recovery;
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 
307  h->max_packet_size = s->fec_col_hd->max_packet_size;
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:
315  ffurl_closep(&s->fec_col_hd);
316  ffurl_closep(&s->fec_row_hd);
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 {
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  }
360  s->fec_arr[i]->bitstring = av_malloc_array(s->bitstring_size, sizeof (uint8_t));
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;
389  uint8_t *bitstring = NULL;
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 
458  ffurl_closep(&s->fec_col_hd);
459  ffurl_closep(&s->fec_row_hd);
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 };
PrompegContext::init
int init
Definition: prompeg.c:116
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
URL_PROTOCOL_FLAG_NETWORK
#define URL_PROTOCOL_FLAG_NETWORK
Definition: url.h:34
out
FILE * out
Definition: movenc.c:54
PrompegContext::packet_size
int packet_size
Definition: prompeg.c:111
n
int n
Definition: avisynth_c.h:760
PrompegFec::ts
uint32_t ts
Definition: prompeg.c:98
prompeg_open
static int prompeg_open(URLContext *h, const char *uri, int flags)
Definition: prompeg.c:270
PrompegContext::rtp_row_sn
uint16_t rtp_row_sn
Definition: prompeg.c:109
prompeg_class
static const AVClass prompeg_class
Definition: prompeg.c:130
end
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:90
AVOption
AVOption.
Definition: opt.h:246
PrompegContext
Definition: prompeg.c:102
b
#define b
Definition: input.c:41
PrompegContext::fec_row_hd
URLContext * fec_row_hd
Definition: prompeg.c:104
AV_WN32A
#define AV_WN32A(p, v)
Definition: intreadwrite.h:538
AVDictionary
Definition: dict.c:30
URLProtocol
Definition: url.h:54
PrompegFec
Definition: prompeg.c:96
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
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:120
PROMPEG_FEC_COL
#define PROMPEG_FEC_COL
Definition: prompeg.c:93
fail
#define fail()
Definition: checkasm.h:120
OFFSET
#define OFFSET(x)
Definition: prompeg.c:120
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
buf
void * buf
Definition: avisynth_c.h:766
PrompegContext::packet_idx_max
int packet_idx_max
Definition: prompeg.c:112
PrompegContext::ttl
int ttl
Definition: prompeg.c:106
ffurl_open_whitelist
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
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:257
prompeg_init
static int prompeg_init(URLContext *h, const uint8_t *buf, int size)
Definition: prompeg.c:321
ff_url_join
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
ff_prompeg_protocol
const URLProtocol ff_prompeg_protocol
Definition: prompeg.c:473
options
static const AVOption options[]
Definition: prompeg.c:123
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:67
NULL
#define NULL
Definition: coverity.c:32
AV_WB16
#define AV_WB16(p, v)
Definition: intreadwrite.h:405
PrompegContext::fec_col
PrompegFec ** fec_col
Definition: prompeg.c:105
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191
parseutils.h
seed
static unsigned int seed
Definition: videogen.c:78
PrompegContext::rtp_buf_size
int rtp_buf_size
Definition: prompeg.c:115
PrompegContext::l
uint8_t l
Definition: prompeg.c:107
AV_WB32
#define AV_WB32(p, v)
Definition: intreadwrite.h:419
PrompegContext::d
uint8_t d
Definition: prompeg.c:107
size
int size
Definition: twinvq_data.h:11134
URLProtocol::name
const char * name
Definition: url.h:55
AV_RB32
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:92
AV_RN64A
#define AV_RN64A(p)
Definition: intreadwrite.h:530
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:203
prompeg_create_bitstring
static int prompeg_create_bitstring(URLContext *h, const uint8_t *buf, int size, uint8_t **bitstring)
Definition: prompeg.c:177
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:187
prompeg_close
static int prompeg_close(URLContext *h)
Definition: prompeg.c:454
PrompegContext::fec_col_hd
URLContext * fec_col_hd
Definition: prompeg.c:104
URLContext
Definition: url.h:38
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
PrompegContext::length_recovery
uint16_t length_recovery
Definition: prompeg.c:110
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
av_url_split
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:4756
url.h
uint8_t
uint8_t
Definition: audio_convert.c:194
PrompegContext::rtp_col_sn
uint16_t rtp_col_sn
Definition: prompeg.c:109
prompeg_write_fec
static int prompeg_write_fec(URLContext *h, PrompegFec *fec, uint8_t type)
Definition: prompeg.c:218
AV_RN32A
#define AV_RN32A(p)
Definition: intreadwrite.h:526
ffurl_closep
int ffurl_closep(URLContext **hh)
Close the resource accessed by the URLContext h, and free the memory used by it.
Definition: avio.c:447
AVFMT_FLAG_BITEXACT
#define AVFMT_FLAG_BITEXACT
When muxing, try to avoid writing any random/volatile data to the output.
Definition: avformat.h:1490
ret
ret
Definition: filter_design.txt:187
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:72
PrompegContext::packet_idx
int packet_idx
Definition: prompeg.c:112
PrompegContext::bitstring_size
int bitstring_size
Definition: prompeg.c:114
avformat.h
PrompegContext::first
int first
Definition: prompeg.c:117
AV_WN64A
#define AV_WN64A(p, v)
Definition: intreadwrite.h:542
xor_fast
static void xor_fast(const uint8_t *in1, const uint8_t *in2, uint8_t *out, int size)
Definition: prompeg.c:137
random_seed.h
PrompegContext::fec_col_tmp
PrompegFec ** fec_col_tmp
Definition: prompeg.c:105
config.h
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:223
ffurl_write
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:424
PrompegContext::fec_arr
PrompegFec ** fec_arr
Definition: prompeg.c:105
PrompegFec::bitstring
uint8_t * bitstring
Definition: prompeg.c:99
PrompegFec::sn
uint16_t sn
Definition: prompeg.c:97
E
#define E
Definition: prompeg.c:121
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
prompeg_write
static int prompeg_write(URLContext *h, const uint8_t *buf, int size)
Definition: prompeg.c:386
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_set
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
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:565
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
PrompegContext::fec_row
PrompegFec * fec_row
Definition: prompeg.c:105
h
h
Definition: vp9dsp_template.c:2038
avstring.h
PrompegContext::rtp_buf
uint8_t * rtp_buf
Definition: prompeg.c:108
snprintf
#define snprintf
Definition: snprintf.h:34
PrompegContext::fec_arr_len
int fec_arr_len
Definition: prompeg.c:113
PROMPEG_FEC_ROW
#define PROMPEG_FEC_ROW
Definition: prompeg.c:94
AV_RB16
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:94
PROMPEG_RTP_PT
#define PROMPEG_RTP_PT
Definition: prompeg.c:92