diff --git a/libavformat/utils.c b/libavformat/utils.c index 2e50c5c0ee..2aa70cd8af 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -5109,11 +5109,12 @@ AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *f static int match_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec, const char **indexptr) { + int match = 1; /* Stores if the specifier matches so far. */ while (*spec) { if (*spec <= '9' && *spec >= '0') { /* opt:index */ if (indexptr) *indexptr = spec; - return 1; + return match; } else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' || *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */ enum AVMediaType type; @@ -5135,14 +5136,14 @@ static int match_stream_specifier(AVFormatContext *s, AVStream *st, FF_DISABLE_DEPRECATION_WARNINGS if (type != st->codecpar->codec_type && (st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN || st->codec->codec_type != type)) - return 0; + match = 0; FF_ENABLE_DEPRECATION_WARNINGS #else if (type != st->codecpar->codec_type) - return 0; + match = 0; #endif if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) - return 0; + match = 0; } else if (*spec == 'p' && *(spec + 1) == ':') { int prog_id, i, j; int found = 0; @@ -5153,6 +5154,7 @@ FF_ENABLE_DEPRECATION_WARNINGS if (spec == endptr || (*endptr && *endptr++ != ':')) return AVERROR(EINVAL); spec = endptr; + if (match) { for (i = 0; i < s->nb_programs; i++) { if (s->programs[i]->id != prog_id) continue; @@ -5165,8 +5167,9 @@ FF_ENABLE_DEPRECATION_WARNINGS } } } + } if (!found) - return 0; + match = 0; } else if (*spec == '#' || (*spec == 'i' && *(spec + 1) == ':')) { int stream_id; @@ -5175,12 +5178,13 @@ FF_ENABLE_DEPRECATION_WARNINGS stream_id = strtol(spec, &endptr, 0); if (spec == endptr || *endptr) /* Disallow empty id and make sure we are at the end. */ return AVERROR(EINVAL); - return stream_id == st->id; + return match && (stream_id == st->id); } else if (*spec == 'm' && *(spec + 1) == ':') { AVDictionaryEntry *tag; char *key, *val; int ret; + if (match) { spec += 2; val = strchr(spec, ':'); @@ -5198,7 +5202,8 @@ FF_ENABLE_DEPRECATION_WARNINGS ret = 0; av_freep(&key); - return ret; + } + return match && ret; } else if (*spec == 'u' && *(spec + 1) == '\0') { AVCodecParameters *par = st->codecpar; #if FF_API_LAVF_AVCTX @@ -5240,17 +5245,16 @@ FF_ENABLE_DEPRECATION_WARNINGS break; } #if FF_API_LAVF_AVCTX - return (par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0; + return match && ((par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0); #else - return par->codec_id != AV_CODEC_ID_NONE && val != 0; + return match && (par->codec_id != AV_CODEC_ID_NONE && val != 0); #endif } else { return AVERROR(EINVAL); } } - /* empty specifier, matches everything */ - return 1; + return match; }