|
|
|
@ -524,46 +524,40 @@ end: |
|
|
|
|
static int parse_frames(void *log_ctx, int **frames, int *nb_frames, |
|
|
|
|
const char *frames_str) |
|
|
|
|
{ |
|
|
|
|
char *p; |
|
|
|
|
int i, ret = 0; |
|
|
|
|
char *frames_str1 = av_strdup(frames_str); |
|
|
|
|
char *saveptr = NULL; |
|
|
|
|
|
|
|
|
|
if (!frames_str1) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
|
|
|
|
|
#define FAIL(err) ret = err; goto end |
|
|
|
|
const char *p; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
*nb_frames = 1; |
|
|
|
|
for (p = frames_str1; *p; p++) |
|
|
|
|
for (p = frames_str; *p; p++) |
|
|
|
|
if (*p == ',') |
|
|
|
|
(*nb_frames)++; |
|
|
|
|
|
|
|
|
|
*frames = av_malloc_array(*nb_frames, sizeof(**frames)); |
|
|
|
|
if (!*frames) { |
|
|
|
|
av_log(log_ctx, AV_LOG_ERROR, "Could not allocate forced frames array\n"); |
|
|
|
|
FAIL(AVERROR(ENOMEM)); |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
p = frames_str1; |
|
|
|
|
p = frames_str; |
|
|
|
|
for (i = 0; i < *nb_frames; i++) { |
|
|
|
|
long int f; |
|
|
|
|
char *tailptr; |
|
|
|
|
char *fstr = av_strtok(p, ",", &saveptr); |
|
|
|
|
|
|
|
|
|
p = NULL; |
|
|
|
|
if (!fstr) { |
|
|
|
|
if (*p == '\0' || *p == ',') { |
|
|
|
|
av_log(log_ctx, AV_LOG_ERROR, "Empty frame specification in frame list %s\n", |
|
|
|
|
frames_str); |
|
|
|
|
FAIL(AVERROR(EINVAL)); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
f = strtol(fstr, &tailptr, 10); |
|
|
|
|
if (*tailptr || f <= 0 || f >= INT_MAX) { |
|
|
|
|
f = strtol(p, &tailptr, 10); |
|
|
|
|
if (*tailptr != '\0' && *tailptr != ',' || f <= 0 || f >= INT_MAX) { |
|
|
|
|
av_log(log_ctx, AV_LOG_ERROR, |
|
|
|
|
"Invalid argument '%s', must be a positive integer < INT_MAX\n", |
|
|
|
|
fstr); |
|
|
|
|
FAIL(AVERROR(EINVAL)); |
|
|
|
|
p); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
if (*tailptr == ',') |
|
|
|
|
tailptr++; |
|
|
|
|
p = tailptr; |
|
|
|
|
(*frames)[i] = f; |
|
|
|
|
|
|
|
|
|
/* check on monotonicity */ |
|
|
|
@ -571,13 +565,11 @@ static int parse_frames(void *log_ctx, int **frames, int *nb_frames, |
|
|
|
|
av_log(log_ctx, AV_LOG_ERROR, |
|
|
|
|
"Specified frame %d is smaller than the last frame %d\n", |
|
|
|
|
(*frames)[i], (*frames)[i-1]); |
|
|
|
|
FAIL(AVERROR(EINVAL)); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
end: |
|
|
|
|
av_free(frames_str1); |
|
|
|
|
return ret; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int open_null_ctx(AVIOContext **ctx) |
|
|
|
|