also make functions use ff_dynarray directly instead of dynarray_add
macro, macro is removed
---
libavformat/cutils.c | 15 +++++++--
libavformat/hls.c | 7 ++--
libavformat/hlsproto.c | 9 +++--
libavformat/internal.h | 17 +---------
libavformat/matroskadec.c | 8 +++--
libavformat/mpegtsenc.c | 3 +-
libavformat/rtpproto.c | 17 +++++++---
libavformat/rtsp.c | 82 +++++++++++++++++++++++++++++----------------
libavformat/rtspenc.c | 5 ++-
libavformat/utils.c | 6 ++--
10 files changed, 107 insertions(+), 62 deletions(-)
diff --git a/libavformat/cutils.c b/libavformat/cutils.c
index f58e152..5cf85b5 100644
--- a/libavformat/cutils.c
+++ b/libavformat/cutils.c
@@ -22,10 +22,10 @@
#include "internal.h"
/* add one element to a dynamic array */
-void ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr, intptr_t elem)
+int ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr, intptr_t elem)
{
/* see similar avconv.c:grow_array() */
- int nb, nb_alloc;
+ int nb, nb_alloc, i;
intptr_t *tab;
nb = *nb_ptr;
@@ -35,11 +35,20 @@ void ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr,
intptr_t elem)
nb_alloc = 1;
else
nb_alloc = nb * 2;
- tab = av_realloc(tab, nb_alloc * sizeof(intptr_t));
+ tab = av_realloc(tab, nb_alloc * sizeof(*tab));
+ if (!tab) {
+ for (i = 0; i < nb; i++)
+ av_freep(tab[i]);
+ av_freep(tab);
+ *nb_ptr = 0;
+ return AVERROR(ENOMEM);
+ }
*tab_ptr = tab;
}
tab[nb++] = elem;
*nb_ptr = nb;
+
+ return 0;
}
#define ISLEAP(y) (((y) % 4 == 0) && (((y) % 100) != 0 || ((y) % 400) == 0))
diff --git a/libavformat/hls.c b/libavformat/hls.c
index ea16f8a..2d56d80 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -161,7 +161,8 @@ static struct variant *new_variant(HLSContext *c, int
bandwidth,
reset_packet(&var->pkt);
var->bandwidth = bandwidth;
ff_make_absolute_url(var->url, sizeof(var->url), base, url);
- dynarray_add(&c->variants, &c->n_variants, var);
+ if (ff_dynarray_add(&c->variants, &c->n_variants, var) < 0)
+ return NULL;
return var;
}
@@ -287,6 +288,7 @@ static int parse_playlist(HLSContext *c, const char *url,
}
if (is_segment) {
struct segment *seg;
+ int err;
if (!var) {
var = new_variant(c, 0, url, NULL);
if (!var) {
@@ -310,7 +312,8 @@ static int parse_playlist(HLSContext *c, const char *url,
}
ff_make_absolute_url(seg->key, sizeof(seg->key), url, key);
ff_make_absolute_url(seg->url, sizeof(seg->url), url, line);
- dynarray_add(&var->segments, &var->n_segments, seg);
+ if ((err = ff_dynarray_add(&var->segments, &var->n_segments,
seg)) < 0)
+ return err;
is_segment = 0;
}
}
diff --git a/libavformat/hlsproto.c b/libavformat/hlsproto.c
index ec357de..7bb6ca0 100644
--- a/libavformat/hlsproto.c
+++ b/libavformat/hlsproto.c
@@ -146,6 +146,7 @@ static int parse_playlist(URLContext *h, const char *url)
} else if (av_strstart(line, "#", NULL)) {
continue;
} else if (line[0]) {
+ int err;
if (is_segment) {
struct segment *seg = av_malloc(sizeof(struct segment));
if (!seg) {
@@ -154,7 +155,10 @@ static int parse_playlist(URLContext *h, const char *url)
}
seg->duration = duration;
ff_make_absolute_url(seg->url, sizeof(seg->url), url, line);
- dynarray_add(&s->segments, &s->n_segments, seg);
+ if ((s->segments = av_realloc_array(s->segments, s->n_segments,
+ sizeof(*s->segments))) < 0)
+
+ return AVERROR(ENOMEM);
is_segment = 0;
} else if (is_variant) {
struct variant *var = av_malloc(sizeof(struct variant));
@@ -164,7 +168,8 @@ static int parse_playlist(URLContext *h, const char *url)
}
var->bandwidth = bandwidth;
ff_make_absolute_url(var->url, sizeof(var->url), url, line);
- dynarray_add(&s->variants, &s->n_variants, var);
+ if ((err = ff_dynarray_add(&s->variants, &s->n_variants, var))
< 0)
+ return err;
is_variant = 0;
}
}
diff --git a/libavformat/internal.h b/libavformat/internal.h
index 1bc3e51..2ce9374 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -42,22 +42,7 @@ typedef struct CodecMime{
enum AVCodecID id;
} CodecMime;
-void ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr, intptr_t elem);
-
-#ifdef __GNUC__
-#define dynarray_add(tab, nb_ptr, elem)\
-do {\
- __typeof__(tab) _tab = (tab);\
- __typeof__(elem) _elem = (elem);\
- (void)sizeof(**_tab == _elem); /* check that types are compatible */\
- ff_dynarray_add((intptr_t **)_tab, nb_ptr, (intptr_t)_elem);\
-} while(0)
-#else
-#define dynarray_add(tab, nb_ptr, elem)\
-do {\
- ff_dynarray_add((intptr_t **)(tab), nb_ptr, (intptr_t)(elem));\
-} while(0)
-#endif
+int ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr, intptr_t elem);
struct tm *ff_brktimegm(time_t secs, struct tm *tm);
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index e6c9adf..85efc8e 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -1966,6 +1966,7 @@ static int matroska_parse_rm_audio(MatroskaDemuxContext
*matroska,
}
while (track->audio.pkt_cnt) {
+ int err;
AVPacket *pkt = av_mallocz(sizeof(AVPacket));
av_new_packet(pkt, a);
memcpy(pkt->data, track->audio.buf
@@ -1974,7 +1975,8 @@ static int matroska_parse_rm_audio(MatroskaDemuxContext
*matroska,
track->audio.buf_timecode = AV_NOPTS_VALUE;
pkt->pos = pos;
pkt->stream_index = st->index;
- dynarray_add(&matroska->packets,&matroska->num_packets,pkt);
+ if ((err = ff_dynarray_add(&matroska->packets, &matroska->num_packets,
pkt)) < 0)
+ return err;
}
return 0;
@@ -2135,7 +2137,9 @@ static int matroska_parse_frame(MatroskaDemuxContext
*matroska,
st->codec->codec_id == AV_CODEC_ID_SSA)
matroska_merge_packets(matroska->prev_pkt, pkt);
else {
- dynarray_add(&matroska->packets,&matroska->num_packets,pkt);
+ int err;
+ if ((err = ff_dynarray_add(&matroska->packets, &matroska->num_packets,
pkt)) < 0)
+ return err;
matroska->prev_pkt = pkt;
}
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 8efd93e..2e02136 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -454,7 +454,8 @@ static MpegTSService *mpegts_add_service(MpegTSWrite *ts,
service->provider_name = av_strdup(provider_name);
service->name = av_strdup(name);
service->pcr_pid = 0x1fff;
- dynarray_add(&ts->services, &ts->nb_services, service);
+ if (ff_dynarray_add(&ts->services, &ts->nb_services, service) < 0)
+ return NULL;
return service;
}
diff --git a/libavformat/rtpproto.c b/libavformat/rtpproto.c
index 0f31539..4ddf0fa 100644
--- a/libavformat/rtpproto.c
+++ b/libavformat/rtpproto.c
@@ -210,13 +210,14 @@ static void build_udp_url(char *buf, int buf_size,
url_add_option(buf, buf_size, "block=%s", exclude_sources);
}
-static void rtp_parse_addr_list(URLContext *h, char *buf,
+static int rtp_parse_addr_list(URLContext *h, char *buf,
struct sockaddr_storage ***address_list_ptr,
int *address_list_size_ptr)
{
struct addrinfo *ai = NULL;
struct sockaddr_storage *source_addr;
char tmp = '\0', *p = buf, *next;
+ int err;
/* Resolve all of the IPs */
@@ -236,7 +237,9 @@ static void rtp_parse_addr_list(URLContext *h, char *buf,
memcpy(source_addr, ai->ai_addr, ai->ai_addrlen);
freeaddrinfo(ai);
- dynarray_add(address_list_ptr, address_list_size_ptr, source_addr);
+ if ((err = ff_dynarray_add(address_list_ptr, address_list_size_ptr,
+ source_addr)) < 0)
+ return err;
} else {
av_log(h, AV_LOG_WARNING, "Unable to resolve %s\n", p);
}
@@ -248,6 +251,7 @@ static void rtp_parse_addr_list(URLContext *h, char *buf,
p = NULL;
}
}
+ return 0;
}
/**
@@ -293,6 +297,7 @@ static int rtp_open(URLContext *h, const char *uri, int
flags)
p = strchr(uri, '?');
if (p) {
+ int err;
if (av_find_info_tag(buf, sizeof(buf), "ttl", p)) {
ttl = strtol(buf, NULL, 10);
}
@@ -319,11 +324,15 @@ static int rtp_open(URLContext *h, const char *uri, int
flags)
}
if (av_find_info_tag(buf, sizeof(buf), "sources", p)) {
av_strlcpy(include_sources, buf, sizeof(include_sources));
- rtp_parse_addr_list(h, buf, &s->ssm_include_addrs,
&s->nb_ssm_include_addrs);
+ if ((err = rtp_parse_addr_list(h, buf, &s->ssm_include_addrs,
+ &s->nb_ssm_include_addrs)) < 0)
+ return err;
}
if (av_find_info_tag(buf, sizeof(buf), "block", p)) {
av_strlcpy(exclude_sources, buf, sizeof(exclude_sources));
- rtp_parse_addr_list(h, buf, &s->ssm_exclude_addrs,
&s->nb_ssm_exclude_addrs);
+ if ((err = rtp_parse_addr_list(h, buf, &s->ssm_exclude_addrs,
+ &s->nb_ssm_exclude_addrs)) < 0)
+ return err;
}
}
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 16b5d41..ff5b3bb 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -294,22 +294,25 @@ typedef struct SDPParseState {
struct RTSPSource **default_exclude_source_addrs; /**< Source-specific
multicast exclude source IP address (from SDP content) */
} SDPParseState;
-static void copy_default_source_addrs(struct RTSPSource **addrs, int count,
+static int copy_default_source_addrs(struct RTSPSource **addrs, int count,
struct RTSPSource ***dest, int
*dest_count)
{
RTSPSource *rtsp_src, *rtsp_src2;
int i;
for (i = 0; i < count; i++) {
+ int err;
rtsp_src = addrs[i];
rtsp_src2 = av_malloc(sizeof(*rtsp_src2));
if (!rtsp_src2)
continue;
memcpy(rtsp_src2, rtsp_src, sizeof(*rtsp_src));
- dynarray_add(dest, dest_count, rtsp_src2);
+ if ((err = ff_dynarray_add(dest, dest_count, rtsp_src2)) < 0)
+ return err;
}
+ return 0;
}
-static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
+static int sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
int letter, const char *buf)
{
RTSPState *rt = s->priv_data;
@@ -321,24 +324,24 @@ static void sdp_parse_line(AVFormatContext *s,
SDPParseState *s1,
RTSPStream *rtsp_st;
RTSPSource *rtsp_src;
struct sockaddr_storage sdp_ip;
- int ttl;
+ int ttl, err;
av_dlog(s, "sdp: %c='%s'\n", letter, buf);
p = buf;
if (s1->skip_media && letter != 'm')
- return;
+ return AVERROR_INVALIDDATA;
switch (letter) {
case 'c':
get_word(buf1, sizeof(buf1), &p);
if (strcmp(buf1, "IN") != 0)
- return;
+ return AVERROR_INVALIDDATA;
get_word(buf1, sizeof(buf1), &p);
if (strcmp(buf1, "IP4") && strcmp(buf1, "IP6"))
- return;
+ return AVERROR_INVALIDDATA;
get_word_sep(buf1, sizeof(buf1), "/", &p);
if (get_sockaddr(buf1, &sdp_ip))
- return;
+ return AVERROR_INVALIDDATA;
ttl = 16;
if (*p == '/') {
p++;
@@ -377,25 +380,31 @@ static void sdp_parse_line(AVFormatContext *s,
SDPParseState *s1,
}
if (codec_type == AVMEDIA_TYPE_UNKNOWN || !(rt->media_type_mask & (1
<< codec_type))) {
s1->skip_media = 1;
- return;
+ return AVERROR_INVALIDDATA;
}
rtsp_st = av_mallocz(sizeof(RTSPStream));
if (!rtsp_st)
- return;
+ return AVERROR(ENOMEM);
rtsp_st->stream_index = -1;
- dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams, rtsp_st);
+ if ((err = ff_dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams,
+ rtsp_st)) < 0)
+ return err;
rtsp_st->sdp_ip = s1->default_ip;
rtsp_st->sdp_ttl = s1->default_ttl;
- copy_default_source_addrs(s1->default_include_source_addrs,
- s1->nb_default_include_source_addrs,
- &rtsp_st->include_source_addrs,
- &rtsp_st->nb_include_source_addrs);
- copy_default_source_addrs(s1->default_exclude_source_addrs,
- s1->nb_default_exclude_source_addrs,
- &rtsp_st->exclude_source_addrs,
- &rtsp_st->nb_exclude_source_addrs);
+ if ((err = copy_default_source_addrs(s1->default_include_source_addrs,
+
s1->nb_default_include_source_addrs,
+ &rtsp_st->include_source_addrs,
+
&rtsp_st->nb_include_source_addrs)) < 0) {
+ s1->nb_default_include_source_addrs = 0;
+ return err;
+ }
+ if ((err = copy_default_source_addrs(s1->default_exclude_source_addrs,
+
s1->nb_default_exclude_source_addrs,
+ &rtsp_st->exclude_source_addrs,
+
&rtsp_st->nb_exclude_source_addrs)) < 0)
+ return err;
get_word(buf1, sizeof(buf1), &p); /* port */
rtsp_st->sdp_port = atoi(buf1);
@@ -430,7 +439,7 @@ static void sdp_parse_line(AVFormatContext *s,
SDPParseState *s1,
} else {
st = avformat_new_stream(s, NULL);
if (!st)
- return;
+ return AVERROR(ENOMEM);
st->id = rt->nb_rtsp_streams - 1;
rtsp_st->stream_index = st->index;
st->codec->codec_type = codec_type;
@@ -530,36 +539,48 @@ static void sdp_parse_line(AVFormatContext *s,
SDPParseState *s1,
int exclude = 0;
get_word(buf1, sizeof(buf1), &p);
if (strcmp(buf1, "incl") && strcmp(buf1, "excl"))
- return;
+ return AVERROR_INVALIDDATA;
exclude = !strcmp(buf1, "excl");
get_word(buf1, sizeof(buf1), &p);
if (strcmp(buf1, "IN") != 0)
- return;
+ return AVERROR_INVALIDDATA;
get_word(buf1, sizeof(buf1), &p);
if (strcmp(buf1, "IP4") && strcmp(buf1, "IP6") && strcmp(buf1,
"*"))
- return;
+ return AVERROR_INVALIDDATA;
// not checking that the destination address actually matches or
is wildcard
get_word(buf1, sizeof(buf1), &p);
while (*p != '\0') {
rtsp_src = av_mallocz(sizeof(*rtsp_src));
if (!rtsp_src)
- return;
+ return AVERROR(ENOMEM);
get_word(rtsp_src->addr, sizeof(rtsp_src->addr), &p);
if (exclude) {
if (s->nb_streams == 0) {
- dynarray_add(&s1->default_exclude_source_addrs,
&s1->nb_default_exclude_source_addrs, rtsp_src);
+ if ((err =
ff_dynarray_add(&s1->default_exclude_source_addrs,
+
&s1->nb_default_exclude_source_addrs,
+ rtsp_src)) < 0)
+ return err;
} else {
rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
- dynarray_add(&rtsp_st->exclude_source_addrs,
&rtsp_st->nb_exclude_source_addrs, rtsp_src);
+ if ((err =
ff_dynarray_add(&rtsp_st->exclude_source_addrs,
+
&rtsp_st->nb_exclude_source_addrs,
+ rtsp_src)) < 0)
+ return err;
}
} else {
if (s->nb_streams == 0) {
- dynarray_add(&s1->default_include_source_addrs,
&s1->nb_default_include_source_addrs, rtsp_src);
+ if ((err =
ff_dynarray_add(&s1->default_include_source_addrs,
+
&s1->nb_default_include_source_addrs,
+ rtsp_src)) < 0)
+ return err;
} else {
rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
- dynarray_add(&rtsp_st->include_source_addrs,
&rtsp_st->nb_include_source_addrs, rtsp_src);
+ if ((err =
ff_dynarray_add(&rtsp_st->include_source_addrs,
+
&rtsp_st->nb_include_source_addrs,
+ rtsp_src)) < 0)
+ return err;
}
}
}
@@ -581,6 +602,7 @@ static void sdp_parse_line(AVFormatContext *s,
SDPParseState *s1,
}
break;
}
+ return 0;
}
int ff_sdp_parse(AVFormatContext *s, const char *content)
@@ -601,6 +623,7 @@ int ff_sdp_parse(AVFormatContext *s, const char *content)
p = content;
for (;;) {
+ int err;
p += strspn(p, SPACE_CHARS);
letter = *p;
if (letter == '\0')
@@ -617,7 +640,8 @@ int ff_sdp_parse(AVFormatContext *s, const char *content)
p++;
}
*q = '\0';
- sdp_parse_line(s, s1, letter, buf);
+ if ((err = sdp_parse_line(s, s1, letter, buf)) < 0)
+ return err;
next_line:
while (*p != '\n' && *p != '\0')
p++;
diff --git a/libavformat/rtspenc.c b/libavformat/rtspenc.c
index d8e5b0e..7fac256 100644
--- a/libavformat/rtspenc.c
+++ b/libavformat/rtspenc.c
@@ -88,11 +88,14 @@ int ff_rtsp_setup_output_streams(AVFormatContext *s, const
char *addr)
/* Set up the RTSPStreams for each AVStream */
for (i = 0; i < s->nb_streams; i++) {
RTSPStream *rtsp_st;
+ int err;
rtsp_st = av_mallocz(sizeof(RTSPStream));
if (!rtsp_st)
return AVERROR(ENOMEM);
- dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams, rtsp_st);
+ if ((err = ff_dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams,
+ rtsp_st)) < 0)
+ return err;
rtsp_st->stream_index = i;
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 0700c5d..2e88aea 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2644,7 +2644,8 @@ AVProgram *av_new_program(AVFormatContext *ac, int id)
program = av_mallocz(sizeof(AVProgram));
if (!program)
return NULL;
- dynarray_add(&ac->programs, &ac->nb_programs, program);
+ if (ff_dynarray_add(&ac->programs, &ac->nb_programs, program) < 0)
+ return NULL;
program->discard = AVDISCARD_NONE;
}
program->id = id;
@@ -2665,7 +2666,8 @@ AVChapter *avpriv_new_chapter(AVFormatContext *s, int id,
AVRational time_base,
chapter= av_mallocz(sizeof(AVChapter));
if(!chapter)
return NULL;
- dynarray_add(&s->chapters, &s->nb_chapters, chapter);
+ if (ff_dynarray_add(&s->chapters, &s->nb_chapters, chapter) < 0)
+ return NULL;
}
av_dict_set(&chapter->metadata, "title", title, 0);
chapter->id = id;
--
1.7.10.4
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel