mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-12-12 10:00:08 +01:00
avformat/utils: fix stream ordering for program ID stream specifiers
Fixes a regression introduced in dbfd042983.
Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
@@ -5107,7 +5107,7 @@ AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *f
|
||||
* >0 if st is a matching stream
|
||||
*/
|
||||
static int match_stream_specifier(AVFormatContext *s, AVStream *st,
|
||||
const char *spec, const char **indexptr)
|
||||
const char *spec, const char **indexptr, AVProgram **p)
|
||||
{
|
||||
int match = 1; /* Stores if the specifier matches so far. */
|
||||
while (*spec) {
|
||||
@@ -5162,6 +5162,8 @@ FF_DISABLE_DEPRECATION_WARNINGS
|
||||
for (j = 0; j < s->programs[i]->nb_stream_indexes; j++) {
|
||||
if (st->index == s->programs[i]->stream_index[j]) {
|
||||
found = 1;
|
||||
if (p)
|
||||
*p = s->programs[i];
|
||||
i = s->nb_programs;
|
||||
break;
|
||||
}
|
||||
@@ -5264,8 +5266,10 @@ int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
|
||||
int ret, index;
|
||||
char *endptr;
|
||||
const char *indexptr = NULL;
|
||||
AVProgram *p = NULL;
|
||||
int nb_streams;
|
||||
|
||||
ret = match_stream_specifier(s, st, spec, &indexptr);
|
||||
ret = match_stream_specifier(s, st, spec, &indexptr, &p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
@@ -5283,11 +5287,13 @@ int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
|
||||
return (index == st->index);
|
||||
|
||||
/* If we requested a matching stream index, we have to ensure st is that. */
|
||||
for (int i = 0; i < s->nb_streams && index >= 0; i++) {
|
||||
ret = match_stream_specifier(s, s->streams[i], spec, NULL);
|
||||
nb_streams = p ? p->nb_stream_indexes : s->nb_streams;
|
||||
for (int i = 0; i < nb_streams && index >= 0; i++) {
|
||||
AVStream *candidate = p ? s->streams[p->stream_index[i]] : s->streams[i];
|
||||
ret = match_stream_specifier(s, candidate, spec, NULL, NULL);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
if (ret > 0 && index-- == 0 && st == s->streams[i])
|
||||
if (ret > 0 && index-- == 0 && st == candidate)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user