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;
99  uint8_t *bitstring;
100 } PrompegFec;
101 
102 typedef struct PrompegContext {
103  const AVClass *class;
106  int ttl;
107  uint8_t l, d;
108  uint8_t *rtp_buf;
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 
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 
218 static int prompeg_write_fec(URLContext *h, PrompegFec *fec, uint8_t type) {
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 
306  h->max_packet_size = s->fec_col_hd->max_packet_size;
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:
314  ffurl_closep(&s->fec_col_hd);
315  ffurl_closep(&s->fec_row_hd);
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 {
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  }
359  s->fec_arr[i]->bitstring = av_malloc_array(s->bitstring_size, sizeof (uint8_t));
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;
388  uint8_t *bitstring = NULL;
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 
455  ffurl_closep(&s->fec_col_hd);
456  ffurl_closep(&s->fec_row_hd);
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 };
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
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
AVOption
AVOption.
Definition: opt.h:247
PrompegContext
Definition: prompeg.c:102
b
#define b
Definition: input.c:40
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:127
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:180
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:306
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:320
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:38
ff_prompeg_protocol
const URLProtocol ff_prompeg_protocol
Definition: prompeg.c:470
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:66
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:235
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:10344
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:96
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:191
prompeg_close
static int prompeg_close(URLContext *h)
Definition: prompeg.c:451
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:271
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:1001
url.h
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:438
AVFMT_FLAG_BITEXACT
#define AVFMT_FLAG_BITEXACT
When muxing, try to avoid writing any random/volatile data to the output.
Definition: avformat.h:1244
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:71
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
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:224
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:415
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
av_dict_set_int
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
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:385
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
d
d
Definition: ffmpeg_filter.c:156
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
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:61
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
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:98
PROMPEG_RTP_PT
#define PROMPEG_RTP_PT
Definition: prompeg.c:92