Commit f3743901 authored by Michael Niedermayer's avatar Michael Niedermayer

avformat: Fix decoder search in find stream info

Fixes Ticket3548
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 369cdf91
...@@ -891,6 +891,12 @@ typedef struct AVStream { ...@@ -891,6 +891,12 @@ typedef struct AVStream {
double (*duration_error)[2][MAX_STD_TIMEBASES]; double (*duration_error)[2][MAX_STD_TIMEBASES];
int64_t codec_info_duration; int64_t codec_info_duration;
int64_t codec_info_duration_fields; int64_t codec_info_duration_fields;
/**
* 0 -> decoder has not been searched for yet.
* >0 -> decoder found
* <0 -> decoder with codec_id == -found_decoder has not been found
*/
int found_decoder; int found_decoder;
int64_t last_duration; int64_t last_duration;
......
...@@ -2655,13 +2655,15 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt, ...@@ -2655,13 +2655,15 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
if (!frame) if (!frame)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
if (!avcodec_is_open(st->codec) && !st->info->found_decoder) { if (!avcodec_is_open(st->codec) &&
st->info->found_decoder <= 0 &&
(st->codec->codec_id != -st->info->found_decoder || !st->codec->codec_id)) {
AVDictionary *thread_opt = NULL; AVDictionary *thread_opt = NULL;
codec = find_decoder(s, st, st->codec->codec_id); codec = find_decoder(s, st, st->codec->codec_id);
if (!codec) { if (!codec) {
st->info->found_decoder = -1; st->info->found_decoder = -st->codec->codec_id;
ret = -1; ret = -1;
goto fail; goto fail;
} }
...@@ -2673,7 +2675,7 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt, ...@@ -2673,7 +2675,7 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
if (!options) if (!options)
av_dict_free(&thread_opt); av_dict_free(&thread_opt);
if (ret < 0) { if (ret < 0) {
st->info->found_decoder = -1; st->info->found_decoder = -st->codec->codec_id;
goto fail; goto fail;
} }
st->info->found_decoder = 1; st->info->found_decoder = 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment