aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-04-21 03:38:07 +0200
committerCarl Eugen Hoyos <cehoyos@ag.or.at>2014-04-23 16:58:23 +0200
commit0385c824f101151b6f0c4eda59249d70bd48fb53 (patch)
treed552dc0c7b2e09805f22b70a0620887de1ea0600
parent30cf47c6f0168355c3ddd806cfeb563c6a2f7978 (diff)
downloadffmpeg-0385c824f101151b6f0c4eda59249d70bd48fb53.tar.gz
avformat: Fix decoder search in find stream info
Fixes Ticket3548 Signed-off-by: Michael Niedermayer <michaelni@gmx.at> (cherry picked from commit f3743901d7df906342f99b179382b19d8a4d9716)
-rw-r--r--libavformat/avformat.h6
-rw-r--r--libavformat/utils.c8
2 files changed, 11 insertions, 3 deletions
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index e0ec3da028..7839c0adc5 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -844,6 +844,12 @@ typedef struct AVStream {
double (*duration_error)[2][MAX_STD_TIMEBASES];
int64_t codec_info_duration;
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;
int64_t last_duration;
diff --git a/libavformat/utils.c b/libavformat/utils.c
index eac71dc366..bff961a90b 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2623,13 +2623,15 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
if (!frame)
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;
codec = find_decoder(s, st, st->codec->codec_id);
if (!codec) {
- st->info->found_decoder = -1;
+ st->info->found_decoder = -st->codec->codec_id;
ret = -1;
goto fail;
}
@@ -2641,7 +2643,7 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
if (!options)
av_dict_free(&thread_opt);
if (ret < 0) {
- st->info->found_decoder = -1;
+ st->info->found_decoder = -st->codec->codec_id;
goto fail;
}
st->info->found_decoder = 1;