[FFmpeg-devel] [PATCH] avformat: Add Pro-MPEG CoP #3-R2 FEC protocol

Michael Niedermayer michael at niedermayer.cc
Tue May 24 21:54:23 CEST 2016


On Wed, May 18, 2016 at 02:46:33PM +0200, Vlad Tarca wrote:
> Fixed a type issue in xor added after the last modification and cleaned up unnecessary NULL checks for av_dict_free
[...]

> +static int prompeg_init(URLContext *h, const uint8_t *buf, int size) {
> +    PrompegContext *s = h->priv_data;
> +    uint32_t seed;
> +    int bitstring_len, rtp_buf_len, i;
> +
> +    s->packet_idx = 0;
> +    s->packet_idx_max = s->l * s->d;
> +    s->packet_size = size;
> +    s->recovery_len = size - 12;

I think size needs to be checked to avoid integer overflow
there is a check later but unless iam mising somthng thats too late

> +    bitstring_len = s->recovery_len + 8;
> +    s->bitstring_size = bitstring_len * sizeof (uint8_t);
> +    rtp_buf_len = 12 + 16 + s->recovery_len;

a check for size being too large is missing too i think


> +    s->rtp_buf_size = rtp_buf_len * sizeof (uint8_t);
> +    s->fec_buf_len = 1 + 2 * s->l; // row + column tmp + column out
> +
> +    if (h->flags & AVFMT_FLAG_BITEXACT) {
> +        s->rtp_col_sn = 0;
> +        s->rtp_row_sn = 0;
> +    } else {
> +        seed = av_get_random_seed();
> +        s->rtp_col_sn = seed & 0x0fff;
> +        s->rtp_row_sn = (seed >> 16) & 0x0fff;
> +    }
> +
> +    s->rtp_buf = NULL;
> +    s->fec_buf = av_malloc_array(s->fec_buf_len, sizeof (PrompegFec*));
> +    if (!s->fec_buf) {
> +        goto fail;
> +    }
> +    for (i = 0; i < s->fec_buf_len; i++) {
> +        s->fec_buf[i] = av_malloc(sizeof (PrompegFec));
> +        if (!s->fec_buf[i]) {
> +            goto fail;
> +        }
> +        s->fec_buf[i]->bitstring = av_malloc_array(bitstring_len, sizeof (uint8_t));
> +        if (!s->fec_buf[i]->bitstring) {
> +            av_freep(&s->fec_buf[i]);
> +            goto fail;
> +        }
> +    }
> +    s->fec_row = *s->fec_buf;
> +    s->fec_col = s->fec_buf + 1;
> +    s->fec_col_tmp = s->fec_buf + 1 + s->l;
> +
> +    s->rtp_buf = av_malloc_array(rtp_buf_len, sizeof (uint8_t));
> +    if (!s->rtp_buf) {
> +        goto fail;
> +    }
> +    memset(s->rtp_buf, 0, s->rtp_buf_size);
> +
> +    s->init = 0;
> +    s->first = 1;
> +
> +    return 0;
> +
> +fail:
> +    if (s->fec_buf) {
> +        for (i = 0; i < s->fec_buf_len; i++) {
> +            if (!s->fec_buf[i]) {
> +                break;
> +            }
> +            av_free(s->fec_buf[i]->bitstring);
> +            av_freep(&s->fec_buf[i]);
> +        }
> +        av_freep(&s->fec_buf);
> +    }

> +    if (s->rtp_buf) {
> +        av_freep(&s->rtp_buf);
> +    }

redudant NULL check


[...]
> +static int prompeg_close(URLContext *h) {
> +    PrompegContext *s = h->priv_data;
> +    int i;
> +
> +    ffurl_close(s->fec_col_hd);
> +    ffurl_close(s->fec_row_hd);
> +
> +    if (s->fec_buf) {
> +        for (i = 0; i < s->fec_buf_len; i++) {
> +            av_free(s->fec_buf[i]->bitstring);
> +            av_freep(&s->fec_buf[i]);
> +        }
> +        av_freep(&s->fec_buf);
> +    }
> +    if (s->rtp_buf)
> +        av_freep(&s->rtp_buf);

this looks duplicated, can this be factored with the similar previous
code ?


[...]
> @@ -377,6 +382,33 @@ static int rtp_open(URLContext *h, const char *uri, int flags)
>          }
>      }
>  
> +    if (s->fec_options_str) {
> +        p = s->fec_options_str;
> +
> +        if (!(fec_protocol = av_get_token(&p, "="))) {
> +            av_log(h, AV_LOG_ERROR, "Failed to parse the FEC protocol value\n");
> +            goto fail;
> +        }
> +        if (strcmp(fec_protocol, "prompeg")) {
> +            av_log(h, AV_LOG_ERROR, "Unsupported FEC protocol %s\n", fec_protocol);
> +            goto fail;
> +        }
> +
> +        p = s->fec_options_str + strlen(fec_protocol);
> +        while (*p && *p == '=') p++;
> +
> +        if (av_dict_parse_string(&fec_opts, p, "=", ":", 0) < 0) {
> +            av_log(h, AV_LOG_ERROR, "Failed to parse the FEC options\n");
> +            goto fail;
> +        }
> +        if (s->ttl > 0) {

> +            snprintf(buf, 256, "%d", s->ttl);

sizeif(buf) or something, hardcoded 256 is bad, that can be missed
if someone changes the array size

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

What does censorship reveal? It reveals fear. -- Julian Assange
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160524/28b7faf8/attachment.sig>


More information about the ffmpeg-devel mailing list