92 #define PROMPEG_RTP_PT 0x60
93 #define PROMPEG_FEC_COL 0x0
94 #define PROMPEG_FEC_ROW 0x1
120 #define OFFSET(x) offsetof(PrompegContext, x)
121 #define E AV_OPT_FLAG_ENCODING_PARAM
124 {
"ttl",
"Time to live (in milliseconds, multicast only)",
OFFSET(ttl),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags =
E },
143 n =
size /
sizeof (uint64_t);
144 s = n *
sizeof (uint64_t);
146 for (
i = 0;
i < n;
i++) {
157 n =
size /
sizeof (uint32_t);
158 s = n *
sizeof (uint32_t);
160 for (
i = 0;
i < n;
i++) {
172 for (
i = 0;
i < n;
i++) {
182 if (
size < 12 || (buf[0] & 0xc0) != 0x80 || (buf[1] & 0x7f) != 0x21) {
186 if (
size !=
s->packet_size) {
199 b[0] = buf[0] & 0x3f;
213 memcpy(
b + 8, buf + 12,
s->length_recovery);
229 buf[0] = 0x80 | (
b[0] & 0x3f);
244 buf[16] = 0x80 |
b[1];
263 memcpy(buf + 28,
b + 8,
s->length_recovery);
277 s->fec_col_hd =
NULL;
278 s->fec_row_hd =
NULL;
280 if (
s->l *
s->d > 100) {
288 if (rtp_port < 1 || rtp_port > UINT16_MAX - 4) {
299 &udp_opts,
h->protocol_whitelist,
h->protocol_blacklist,
h) < 0)
303 &udp_opts,
h->protocol_whitelist,
h->protocol_blacklist,
h) < 0)
306 h->max_packet_size =
s->fec_col_hd->max_packet_size;
328 if (size < 12 || size > UINT16_MAX + 12) {
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;
338 s->bitstring_size = 8 +
s->length_recovery;
339 s->fec_arr_len = 1 + 2 *
s->l;
346 s->rtp_col_sn =
seed & 0x0fff;
347 s->rtp_row_sn = (
seed >> 16) & 0x0fff;
354 for (
i = 0;
i <
s->fec_arr_len;
i++) {
356 if (!
s->fec_arr[
i]) {
360 if (!
s->fec_arr[
i]->bitstring) {
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;
373 memset(
s->rtp_buf, 0,
s->rtp_buf_size);
389 int col_idx, col_out_idx, row_idx;
398 col_idx =
s->packet_idx %
s->l;
399 row_idx =
s->packet_idx /
s->l %
s->d;
403 if (!
s->first ||
s->packet_idx > 0) {
407 memcpy(
s->fec_row->bitstring, bitstring,
s->bitstring_size);
411 xor_fast(
s->fec_row->bitstring, bitstring,
s->fec_row->bitstring,
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;
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);
427 xor_fast(
s->fec_col_tmp[col_idx]->bitstring, bitstring,
428 s->fec_col_tmp[col_idx]->bitstring,
s->bitstring_size);
432 if (!
s->first &&
s->packet_idx %
s->d == 0) {
433 col_out_idx =
s->packet_idx /
s->d;
438 if (++
s->packet_idx >=
s->packet_idx_max) {
459 for (
i = 0;
i <
s->fec_arr_len;
i++) {
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.
int ffurl_closep(URLContext **hh)
Close the resource accessed by the URLContext h, and free the memory used by it.
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
Write size bytes from buf to the resource accessed by h.
#define flags(name, subs,...)
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.
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
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.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
#define LIBAVUTIL_VERSION_INT
static int prompeg_init(URLContext *h, const uint8_t *buf, int size)
static const AVClass prompeg_class
static const AVOption options[]
const URLProtocol ff_prompeg_protocol
static int prompeg_write_fec(URLContext *h, PrompegFec *fec, uint8_t type)
static void xor_fast(const uint8_t *in1, const uint8_t *in2, uint8_t *out, int size)
static int prompeg_open(URLContext *h, const char *uri, int flags)
static int prompeg_create_bitstring(URLContext *h, const uint8_t *buf, int size, uint8_t **bitstring)
static int prompeg_write(URLContext *h, const uint8_t *buf, int size)
static int prompeg_close(URLContext *h)
Describe the class of an AVClass context structure.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
PrompegFec ** fec_col_tmp
#define av_malloc_array(a, b)
int ff_url_join(char *str, int size, const char *proto, const char *authorization, const char *hostname, int port, const char *fmt,...)
unbuffered private I/O API
#define URL_PROTOCOL_FLAG_NETWORK